我对SQL知之甚少,创建一个有友谊的基本社交网络是我的职责。为此,我创建了一个表(有更多列,但为了这个问题我删除了它们);
CREATE TABLE USERS
(USER_ID CHAR(8) NOT NULL,
USER_LNAME VARCHAR(20) NOT NULL,
USER_FNAME VARCHAR(20) NOT NULL,
PRIMARY KEY (USER_ID));
我创建了另一个表,您可以在其中插入两个人的user_id,并生成他们成为朋友的时间。
CREATE TABLE USERFRIEND
(USER_ID CHAR(8) NOT NULL,
FRIEND_ID CHAR(8) NOT NULL,
EST_DATE TIMESTAMP NOT NULL,
PRIMARY KEY (USER_ID, FRIEND_ID),
FOREIGN KEY (USER_ID) REFERENCES USERS (USER_ID),
FOREIGN KEY (FRIEND_ID) REFERENCES USERS (USER_ID));
我在插入任何一个表的数据时都没有任何问题。例如,这里是我插入的数据的示例(我的实际数据库有大约15个朋友)
INSERT INTO USERS
VALUES ('10000001', 'Jones', 'Tom');
INSERT INTO USERS
VALUES ('10000002', 'Smith', 'Michael');
INSERT INTO USERS
VALUES ('10000003', 'Johnson', 'Andrew');
INSERT INTO USERS
VALUES ('10000004', 'Williams', 'David');
和友谊
INSERT INTO USERFRIEND
VALUES ('10000001', '100000002', CURRENT_TIMESTAMP);
INSERT INTO USERFRIEND
VALUES ('10000001', '100000003', CURRENT_TIMESTAMP);
INSERT INTO USERFRIEND
VALUES ('10000002', '100000004', CURRENT_TIMESTAMP);
其中一项任务是获取一个人拥有的朋友列表。
例如, Michael Smith将成为Tom Jones和David Williams的朋友(01,04) 我的问题是,在一个友谊中,Michael是user_id,而另一个是friend_id
到目前为止,我所做的最好的结果是这段代码;
SELECT user_id, friend_id
FROM USERFRIEND
WHERE USER_ID = 10000002
OR FRIEND_ID = 10000002;
这至少会返回Smith(10000002)与朋友在一起的人的所有ID的结果,但我不知道当USER_ID和FRIEND_ID都引用相同的名字时,如何让它返回这些人的相关名称的事情。
SELECT DISTINCT a.user_fname, a.user_lname, b.USER_ID, b.FRIEND_ID
FROM USERS a, USERFRIEND b
WHERE b.USER_ID = 10000002
OR b.FRIEND_ID = 10000002;
我已尝试过此代码,虽然在我的数据库中,只有20个友情,但它返回80个结果,并且没有一个名称正确匹配。
希望你们中的一个人能找到(可能是简单的)解决方案,因为我不知道我应该做什么。
答案 0 :(得分:0)
由于两个表之间没有连接,因此上面的查询会生成笛卡尔积。您应该至少有n-1个连接,其中n是使用的表的数量。
你可以加入这两个表 -
SELECT DISTINCT a.user_fname, a.user_lname, b.USER_ID, b.FRIEND_ID
FROM USERS a, USERFRIEND b
WHERE a.user_id=b.user_id
or a.user_d=b.friend_id