MySQL Complex查询无法返回正确的结果

时间:2012-04-18 23:40:36

标签: php mysql null

我有以下查询:

'SELECT * FROM posts LEFT JOIN taxi ON taxi.taxiID = posts.postID
    WHERE (taxi.value = 1 AND taxi.userID ='.$userID.') 
    AND ??????????????
    ORDER BY taxi.ID DESC
    LIMIT 10'

网站的工作方式是用户可以将帖子标记为“喜欢”。当喜欢一个帖子时,出租车表被赋予一个新的行,其中taxiID与postID相同,userID用于存储喜欢该帖子的用户,value被设置为1.不喜欢帖子集{{ 1}}到0。

我想显示value为1且valueuserID的所有帖子 - 请检查。但是,我还希望查询显示用户尚未喜欢帖子的所有帖子。事情是,如果用户尚未喜欢帖子,则$userIDuserIDNULLvalue。如果我查询,我将跳过其他用户喜欢但用户没有的帖子。

这是NULL表:

taxi

假设ID taxiID userID value 1 1 1 1 2 1 6 1 3 1 4 0 4 2 1 0 5 2 6 1 6 2 4 0 7 3 6 1 8 3 4 0 为1,我的查询应显示$userID 1和3(因为用户1喜欢taxiID 1并且不喜欢或不喜欢ID 3。

我发布的代码只会显示taxiID 1。

问题是,我的查询中缺少的是什么应该给出上述内容?

3 个答案:

答案 0 :(得分:3)

您似乎想要查找用户不喜欢的所有taxiID

SELECT taxiID 
FROM taxi
GROUP BY taxiID
HAVING taxiID NOT IN 
      ( SELECT taxiID
        FROM taxi 
        WHERE userID = '.$userID.'
          AND value = 0
      )
ORDER BY taxiID DESC
LIMIT 10

SQL-Fiddle

中进行测试

您可能有post表,因此最好使用:

SELECT *                               --- whatever columns from `post` table
FROM post
WHERE postID NOT IN                     
      ( SELECT taxiID
        FROM taxi 
        WHERE userID = '.$userID.'
          AND value = 0
      )
ORDER BY postID 
LIMIT 10

如果taxi.taxiID表示postID,则应将其重命名为taxi.postID。它确实很混乱。

答案 1 :(得分:1)

我将此作为评论,但我认为这是我的最终答案:

SELECT * FROM posts 
LEFT JOIN taxi ON taxi.taxiID = posts.postID
WHERE (taxi.value != 0 AND taxi.userID ='.$userID.') 
OR taxi.value is null
ORDER BY taxi.ID DESC
LIMIT 10

好的,这是上述查询应该发生的事情:

  1. 获取所有帖子
  2. 从出租车表中添加信息,并通过postID
  3. 将出租车数据与发布数据相关联
  4. 仅显示taxi.value是否为0(表示可以为null或1)并且如果userID与我们的变量相同

答案 2 :(得分:0)

假设taxi.taxiID与post.ID相同,并且您希望选择尚未标记用户的所有帖子,请尝试:

SELECT * FROM post WHERE ID NOT IN
(SELECT taxiID FROM taxi WHERE userID = 1)

这适用于ID = 1的用户。