我对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'
并希望查看观众的所有分享者的时间表(eid
和description
)
我用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
))
此代码尚未完成。我必须自然加入活动和 把描述数量。但我卡在这里
如果您有更好的方法来编写此功能,请
答案 0 :(得分: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'