我希望查询3个不同的表。
我的方法是从 FRIENDS TABLE 中获取朋友。所以,输出将是:
我尝试过这个解决方案
SELECT users.firstname, users.lastname,
users.screenname, profile.profile_pic, friends.friend_id
FROM website.users users
INNER JOIN website.friends friends ON (users.user_id = friends.friend_id)
LEFT JOIN profile ON (friends.friend_id = profile.user_id)
WHERE (friends.user_id = "12052822" or friends.friend_id = "12052822")
问题是当它与一条记录匹配时,它会输出“friend.user_id”列。那不是我想做的!如果用户已登录,则查询将获取所有朋友 ...如何以更简单,更好的方式执行此操作?
答案 0 :(得分:1)
id
表中的user_id
和users
列至少令人困惑?为什么有两个'标识符'列?哪两个加入了friend.user_id
?它是否与friend.friend_id
连接的列相同?目标是显示friends.user_id
是刚刚登录的用户的所有名称,还是friends.friend_id
是刚刚登录的用户的所有名称,或两者兼而有之?
在进一步澄清之前,我将假设结果集应该包括两个朋友列表:被用户朋友和用户结识的人。我还假设users.user_id
列是加入列。
我们可以轻松地将其写为UNION,并注意到UNION将消除重复条目,因为登录的用户已经为已登录用户的用户提供了支持(因此,在该用户中有两个条目)在friends
和user_id
中包含相同值对的friend_id
表。
进入TDQD(测试驱动查询设计),我们可以编写(假设新登录的用户是user_id = 12052822
):
SELECT u.user_id, u.firstname, u.lastname, u.screenname, p.profile_pic
FROM website.friends AS f
JOIN website.users AS u ON f.friend_id = u.user_id
JOIN website.profile AS p ON p.user_id = u.user_id
WHERE f.user_id = 12052822;
SELECT u.user_id, u.firstname, u.lastname, u.screenname, p.profile_pic
FROM website.friends AS f
JOIN website.users AS u ON f.user_id = u.user_id
JOIN website.profile AS p ON p.user_id = u.user_id
WHERE f.friend_id = 12052822;
SELECT u.user_id, u.firstname, u.lastname, u.screenname, p.profile_pic
FROM website.friends AS f
JOIN website.users AS u ON f.friend_id = u.user_id
JOIN website.profile AS p ON p.user_id = u.user_id
WHERE f.user_id = 12052822;
UNION
SELECT u.user_id, u.firstname, u.lastname, u.screenname, p.profile_pic
FROM website.friends AS f
JOIN website.users AS u ON f.user_id = u.user_id
JOIN website.profile AS p ON p.user_id = u.user_id
WHERE f.friend_id = 12052822;
您可以单独测试和调试每个组件查询,然后将它们组合起来以创建最终答案。