[英]SQL Query with joins and operators
我最困惑的查询遇到了麻烦。 它以前曾经起作用,但是几个月前我必须更改了一个变量,所以现在它不起作用了。
它的意思是:
select * from users, * from media and * from friends
然后仅在媒体包含朋友ID或您自己的ID时才显示该媒体 。 但是它显示的是朋友媒体,而不是我自己的。 和朋友体系如下: id
, senders_id
, recipient_id
, status
状态为0(不接受)和1(接受)
这是以下查询:
SELECT DISTINCT users.id, users.firstname, users.lastname,
media.date, media.id, media.time, media.text, media.userID,
media.author_id, media.ip, media.post_id, media.format,
media.file_format, media.MediaTxt, media.author_firstname,
media.author_lastname, media.shared, media.relation
FROM users
JOIN friends
ON users.id IN (friends.sender, friends.recipient)
JOIN media
ON (users.id = media.userID)
WHERE 151 IN (friends.sender,friends.recipient)
AND media.relation = 'feed'
ORDER BY media.time DESC, media.date DESC
主键和外键:
friends.id (PRI Key)
media.id (PRI Key)
users.id (PRI Key)`
--
users.id
与media.UsrID
和friends.recipient/sender
我认为最大的问题是,如果一个人没有朋友(例如,我猜上面的user.id 151?),那么JOIN friends
将导致返回零行。
您可能想使用LEFT JOIN
,但是还有更大的问题-整个查询有点难以理解,也许不是解决问题的最佳方法。
您的意思是“列出每个用户及其朋友以及他们上载的所有媒体。如果用户ID 151在朋友关系中显示为发件人或收件人,请给我提供该媒体。” 即使您使用左联接,也不会帮助没有朋友的人,因为这些列将为空。 您还需要将so.users_id添加到比较列表中,例如:
SELECT DISTINCT users.id, users.firstname, users.lastname,
media.date, media.id, media.time, media.text, media.userID,
media.author_id, media.ip, media.post_id, media.format,
media.file_format, media.MediaTxt, media.author_firstname,
media.author_lastname, media.shared, media.relation
FROM users
LEFT JOIN friends
ON users.id IN (friends.sender, friends.recipient)
JOIN media
ON (users.id = media.userID)
WHERE 151 IN (users.id, friends.sender,friends.recipient)
AND media.relation = 'feed'
ORDER BY media.time DESC, media.date DESC
请注意,我没有打扰过LEFT JOINing媒体,因为它是您所追求的媒体,并且返回空白是毫无意义的。
但是查询仍然写得有些倒退-如果您将其编写为以下内容,则可能会更清楚:
SELECT DISTINCT users.id, users.firstname, users.lastname,
media.date, media.id, media.time, media.text, media.userID,
media.author_id, media.ip, media.post_id, media.format,
media.file_format, media.MediaTxt, media.author_firstname,
media.author_lastname, media.shared, media.relation
FROM users
JOIN media
ON (users.id = media.userID)
LEFT JOIN friends
ON users.id IN (friends.sender, friends.recipient)
WHERE 151 IN (users.id, friends.sender, friends.recipient)
AND media.relation = 'feed'
ORDER BY media.time DESC, media.date DESC
另外,我希望将151替换为位置参数,这样您就不会引入SQL注入攻击了!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.