我有以下查询:
'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
的所有帖子 - 检查。但是,我还希望查询显示用户尚未喜欢帖子的所有帖子。问题是,如果用户还没有喜欢某个帖子,userID
会NULL
相应的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
好的,这就是上述查询应该发生的情况:
- 获取所有帖子
- 从出租车表添加信息,并通过 postID 将出租车数据与帖子数据相关联
- 仅当 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的用户。