2015-04-09 5 views
0

У меня возникают проблемы с этим запросом, который использует три разные таблицы. Я также считаю, что буду использовать ключевые слова NOT EXISTS и NOT WITHIN, но я не полностью уверен в этом. Я опубликую определение запроса, таблицы, которые я использую, и то, что я пробовал до сих пор. Спасибо за помощь в продвижении!Как написать запрос, который объединяет 3 таблицы

Запрос:

Find the users that create jobs that utilize all proteins. 

Таблицы:

CREATE TABLE Protein(pid INTEGER,name varchar(50),PRIMARY KEY(pid)); 

CREATE TABLE Job(uid INTEGER,job_id INTEGER AUTO_INCREMENT,input 
varchar(500),status varchar(100),start_time time,finish_time time,FOREIGN 
KEY(uid) REFERENCES User(uid) ON DELETE CASCADE,PRIMARY KEY(job_id)); 

CREATE TABLE User(uid INTEGER AUTO_INCREMENT,address VARCHAR(40),city 
VARCHAR(20),state VARCHAR(20),zipcode VARCHAR(10), username 
VARCHAR(10),email VARCHAR(30),primary key (uid)); 

CREATE TABLE job_protein(job_id INTEGER, pid INTEGER, PRIMARY KEY(job_id, pid)); 

Что Ive пытался до сих пор ...

SELECT u.uid, j.jobid, count(j.jobid) 
FROM job j 
INNER JOIN job_proteins p 
ON j.jobid = p.jobid 
INNER JOIN user u 
ON p.uid = u.uid 
GROUP BY j.jobid 
HAVING count(j.jobid) = (SELECT count(pid) FROM Protein); 

ли то, что я получить работу, которые используют каждый белок ?.

+0

"ON p.uid = u.uid" => "ON j.uid = u.uid" ad job_protein не имеет uid. – niry

+0

в sql-версии, которую я использую, я думаю, что этот запрос не сработает, потому что u.uid не содержится в предложении group by или в агрегированной функции –

ответ

1

Отсутствует элемент в группе по статье:

SELECT u.uid, j.jobid, count(j.jobid) 
FROM job j 
INNER JOIN job_proteins p 
ON j.jobid = p.jobid 
INNER JOIN user u 
ON p.uid = j.uid -- and you had wrong alias here 
GROUP BY u.uid, j.jobid -- right here 
HAVING count(j.jobid) = (SELECT count(pid) FROM Protein); 
+0

Хотя я, вероятно, сделаю подсчет белков в переменной, а затем использую это в предложение having –

+0

Итак, это дает мне список всех идентификаторов работы, которые используют каждый белок? –

+0

Я так считаю, да ... у вас была правильная идея, всего несколько синтаксических вопросов. –

0

Вы можете упростить запрос, потому что вы, кажется, не нуждаются в user таблице.

Во-вторых, ваша постановка проблемы неоднозначна. Если цель состоит в том, чтобы найти пользователь, которые имеют одну работы должны иметь все белки, то следующий получает пару пользователя/работу:

SELECT j.uid, jp.jobid, count(*) 
FROM job j JOIN 
    job_proteins jp 
    ON j.jobid = jp.jobid 
GROUP BY j.uid, jp.jobid 
HAVING count(distinct jp.pid) = (SELECT count(*) FROM Protein); 

Незначительная модификация Получает только пользователи:

SELECT DISTINCT j.uid 
FROM job j JOIN 
    job_proteins jp 
    ON j.jobid = jp.jobid 
GROUP BY j.uid, jp.jobid 
HAVING count(distinct jp.pid) = (SELECT count(*) FROM Protein); 

ПРИМЕЧАНИЕ. Это один из немногих случаев, когда SELECT DISTINCT используется с GROUP BY.

Если цель состоит в том, чтобы найти пользователей, которые используют все белки через свои рабочие места:

SELECT j.uid 
FROM job j JOIN 
    job_proteins jp 
    ON j.jobid = jp.jobid 
GROUP BY j.uid 
HAVING count(distinct jp.pid) = (SELECT count(*) FROM Protein); 

Отличие от первого запроса является то, что положение GROUP BY изменилось.

Смежные вопросы