使用in和自然连接数量的mysql查询混淆

时间:2013-12-06 07:32:28

标签: mysql sql

我对MySQL查询感到困惑。

我们说

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' 并希望查看观众的所有分享者的时间表(eiddescription) 我用in和自然连接数量尝试了它,但代码看起来很难看......

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

    ))

此代码尚未完成。我必须自然加入活动和 把描述数量。但我卡在这里

如果您有更好的方法来编写此功能,请

1 个答案:

答案 0 :(得分:0)

只要有相同名称的列,

NATURAL JOIN就会加入表。因此,例如,一个可以自然地将invited加入personevent,因为列pideid分别存在在桌子对面。

但请注意,通常最好避免NATURAL JOIN,而是明确指定您希望加入USINGON的列,因为它可以避免意外加入不相关的列碰巧被命名为相似(特别是如果一个人的架构将来发生变化)。

加入friend_ofinvited时,没有任何可以命名的列,因此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'