mysql查询中使用in和natural连接数量的混淆

mysql查询中使用in和natural连接数量的混淆,mysql,sql,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 TABL

我对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和natural连接数量,但代码看起来很难看

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

    ))
此代码尚未完成。我必须自然地参加活动和活动 把描述放在数量上。但是我被困在这里了


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

NATURAL JOIN
在存在同名列的地方连接表。因此,例如,可以自然地将
invested
加入
person
event
,因为
pid
eid
列分别存在于表中

但是请注意,通常最好避免
自然连接
,而是使用或上的
显式命名要连接的列,因为这样可以避免意外连接到碰巧命名相似的不相关列(特别是在将来架构发生更改时)

当将
friend\u加入到
邀请的时,没有任何类似的命名列,因此
自然加入
将有效地执行交叉加入。因此,我们可以采取如下措施:

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'

你的问题是什么?不应在中使用
,而应与其他表联接。事件的PID是PID的创建者。这给了我一个与其他表联接的问题。另一个PID是邀请参加派对的人Hey eggtal,您的代码似乎正确,但当我用此代码尝试时,它返回空值,我用手检查,它应该返回一些值。strange@Kingkong当前位置如果不查看您的数据,就无法说出发生了什么事。也许在网上发布一个样本?