我有以下查询:
'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且value
为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
为1,我的查询应显示$userID
1和3(因为用户1喜欢taxiID
1并且不喜欢或不喜欢ID
3。
我发布的代码只会显示taxiID
1。
问题是,我的查询中缺少的是什么应该给出上述内容?
答案 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
中进行测试
您可能有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
好的,这是上述查询应该发生的事情:
答案 2 :(得分:0)
假设taxi.taxiID与post.ID相同,并且您希望选择尚未标记用户的所有帖子,请尝试:
SELECT * FROM post WHERE ID NOT IN
(SELECT taxiID FROM taxi WHERE userID = 1)
这适用于ID = 1的用户。