繁体   English   中英

带联接和运算符的SQL查询

[英]SQL Query with joins and operators

我最困惑的查询遇到了麻烦。 它以前曾经起作用,但是几个月前我必须更改了一个变量,所以现在它不起作用了。

它的意思是:

select * from users, * from media and * from friends

然后仅在媒体包含朋友ID或您自己的ID时才显示该媒体 但是它显示的是朋友媒体,而不是我自己的。 和朋友体系如下: idsenders_idrecipient_idstatus

状态为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.idmedia.UsrIDfriends.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM