MySQL 复杂查询未返回正确的结果


MySQL Complex query not returning right results

我有以下查询:

'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。不喜欢帖子会将value设置为 0。

我想显示value为 1 且userID $userID的所有帖子 - 检查。但是,我还希望查询显示用户尚未喜欢帖子的所有帖子。问题是,如果用户还没有喜欢某个帖子,userIDNULL相应的value 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

假设$userID是 1,我的查询应该显示 1 和 3 taxiID(因为用户 1 喜欢 ID 1 并且不喜欢或不喜欢 taxiID 3。

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

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

似乎您想找到该用户不喜欢的所有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。这非常令人困惑。

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

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. 仅当 taxi.value 不是 0(意味着它可以是 null 或 1)并且用户 ID 与我们的变量相同时才显示

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

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

这当然适用于ID=1的用户。