0

我没有太多的 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,而在另一个朋友中

到目前为止,我得出的最好结果就是这段代码;

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 个结果,并且没有一个名称正确匹配。

希望你们中的一个人能为我找到(可能很简单)的解决方案,因为我不知道我应该做什么。

4

1 回答 1

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
于 2013-10-01T06:36:48.187 回答