我遇到了最混乱的查询问题。它之前有用,但几个月前我必须更改一个变量,所以现在它不起作用。
它的意图是:
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
答案 0 :(得分:0)
我认为最大的问题是,如果一个人没有朋友(例如,我正在猜测的是user.id 151),那么JOIN friends
将导致返回零行。
你可能想要使用LEFT JOIN
,但问题比那更大 - 整个查询有点难以理解,也许不是你追求的最好的方法。
你有点说“列出每个用户及其朋友以及他们上传的所有媒体。如果用户ID 151在朋友关系中显示为发件人或收件人,请给我媒体。”即使你使用左连接,这也不会帮助没有朋友的人,因为这些列将为null。您还需要将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注入攻击!