2013-12-06 2 views
0

Я смущен запросом MySQL.mysql путаница запроса с использованием in и количества естественного объединения

Пусть говорят, что мы имеем

CREATE TABLE person (
    pid VARCHAR(50) PRIMARY KEY, 
    passwd CHAR(32) NOT NULL, 
    fname VARCHAR(50), 
    lname VARCHAR(50), 
    d_privacy INT NOT NULL -- change from part 1 spec, which said varchar 
); 

CREATE TABLE event (
    eid INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
    start_time TIME NOT NULL, 
    duration TIME NOT NULL, 
    description VARCHAR(50), 
    pid   VARCHAR(50), 
    FOREIGN KEY (pid) REFERENCES person(pid) 
); 


CREATE TABLE invited ( 
    pid VARCHAR(50) NOT NULL, 
    eid INT NOT NULL, 
    response INT, 
    visibility INT, 
    PRIMARY KEY (pid, eid), 
    FOREIGN KEY (pid) REFERENCES person(pid), 
    FOREIGN KEY (eid) REFERENCES event(eid) 
); 

CREATE TABLE friend_of (
    sharer VARCHAR(50) NOT NULL, 
    viewer VARCHAR(50) NOT NULL, 
    level INT, 
    PRIMARY KEY (sharer, viewer), 
    FOREIGN KEY (sharer) REFERENCES person(pid), 
    FOREIGN KEY (viewer) REFERENCES person(pid) 
); 

Например сказать, что я зритель = «AA» и хотят видеть график зрителя все SHARER в (eid и description) Я попробовал это в и естественное соединение количество, но код выглядит уродливым ...

select * 
from invited natural join person 
where person.pid in 

(

select pid 

from invited 
where pid in(

SELECT sharer 
from friend_of 
natural join invited 
where friend_of.viewer = 'AA' 
and friend_of.sharer = invited.pid 

    )) 

Этот код еще не закончен. Мне нужно естественное соединение с событием и введите описание количества. но я застрял здесь

если у вас есть лучший способ написать эту функцию, пожалуйста.

+0

Что вы хотите сказать? Вместо использования 'IN', вы должны присоединиться к другим таблицам. – Barmar

+0

PID события является создателем pid. это дает мне проблему с присоединением к другим таблицам. другой PID - тот, кто приглашен на вечеринку. – Kingkong

ответ

0

NATURAL JOIN объединяет таблицы везде, где есть одинаково названные столбцы. Так, например, один может естественно присоединяться к invited до person или event, так как столбцы pid и eid соответственно существуют через таблицы.

Однако обратите внимание, что это вообще лучше избегать NATURAL JOIN и вместо того, чтобы явно назвать столбцы, по которым вы хотите присоединиться к USING или ON, так как это позволяет избежать случайного присоединения на несвязанных столбцов, которые происходят быть названы одинаково (особенно если в изменениях схемы в будущем).

При присоединении friend_of к invited, нет никаких одноименных столбцов и так NATURAL JOIN будет эффективно выполнять CROSS JOIN. Поэтому вместо этого можно сделать что-то вроде:

SELECT * 
FROM person 
    JOIN invited USING (pid) 
    JOIN event  USING (pid, eid) 
    JOIN friend_of ON friend_of.sharer = invited.pid 
WHERE friend_of.viewer = 'AA' 
+0

Привет, eggtal, ваш код кажется правильным, но когда я попробовал его с помощью этого кода, он возвращает пустое значение, я проверяю его рукой и полагаю, что нужно вернуть некоторое значение. странно – Kingkong

+0

@Kingkong: Невозможно сказать, в чем дело, не видя ваши данные. Возможно, разместите образец на http://sqlfiddle.com? – eggyal

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