1

我有以下查询:

'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对应valueNULL. 如果我对此进行查询,我将跳过其他用户喜欢但用户没有喜欢的那些帖子。

这是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,我的查询应该显示taxiID1 和 3(因为用户 1 喜欢ID1 并且没有喜欢或不喜欢taxiID3。

我发布的代码只会显示taxiID1。

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

4

3 回答 3

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. 这是非常令人困惑的。

于 2012-04-18T23:55:31.473 回答
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. 仅显示 tax.value 是否不为 0(意味着它可以为 null 或 1)并且 userID 是否与我们的变量相同
于 2012-04-19T00:37:08.557 回答
0

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

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

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

于 2012-04-19T00:01:32.377 回答