带有连接和运算符的SQL查询

时间:2015-09-02 07:44:31

标签: php mysql

我遇到了最混乱的查询问题。它之前有用,但几个月前我必须更改一个变量,所以现在它不起作用。

它的意图是:

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

相同

1 个答案:

答案 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注入攻击!