SQL - 获取所有未被当前用户投票的帖子

问题描述 投票:0回答:2

我有 2 个 MySQL 表,即

posts
votes

posts 表包含作者(用户)发表的文章。
votes 表包含用户对特定 post 的投票。

我想获得所有帖子没有当前用户投票

我应该写什么样的MySQL语句才能达到预期的结果?

表 1 posts 包含 4 列。

post_id
是主键,
author_id
存储
user_id
来自 user 表。

post_id
(int-11)
标题
(正文)
author_id
(int-11)
created
(日期时间)
1 这是第一篇文章 2 2023-02-24 14:43:49
2 这是第二篇文章 5 2023-02-26 18:16:17
3 这是第三篇文章 1 2023-03-01 05:42:51
4 这是第四篇文章 2 2023-03-01 08:20:15
5 这是第5篇文章 8 2023-03-02 12:35:49


表 2 votes 包含 4 列。

vote_id
是主键,
post_id
author_id
存储外部表的值,即 postuser
vote
列可以存储 enum('approve', 'reject')

vote_id
(int-11)
post_id
(int-11)
user_id
(int-11)
vote
enum('批准', '拒绝')
1 4 2 同意
2 2 3 拒绝
3 3 3 拒绝
4 1 2 同意

如何获取所有未被当前用户投票或未被当前用户投票的帖子行。 (两个条件分别)

此外,如何在同一 SQL 语句中获取特定帖子的投票数?

期望的结果 (未投票)

user_id = 3
当前用户
user_id = 3
已经投票给
post_id 2 & 3

除了 post_id = 2 & 3, 应该返回所有行。

post_id
(int-11)
标题
(正文)
author_id
(int-11)
created
(日期时间)
1 这是第一篇文章 2 2023-02-24 14:43:49
4 这是第四篇文章 2 2023-03-01 08:20:15
5 这是第5篇文章 8 2023-03-02 12:35:49

我试过这个SQL来获取当前用户(3)投票的所有行,但它显示了所有行。

SELECT p.*, v.*
FROM `posts` p
LEFT JOIN `votes` v ON p.post_id = v.post_id 
LEFT JOIN `votes` v2 on p.post_id = v2.post_id and v2.user_id='3';

非常感谢您的时间和解决方案!

mysql sql mysqli left-join inner-join
2个回答
0
投票

例如:

SELECT p.*
FROM `posts` p
LEFT JOIN `votes` v ON p.post_id = v.post_id 
WHERE v.user_id = 3

WHERE v.user_id <> 3
对于其他情况。 如果我理解正确的话。 哦,是的,user_id 与作者无关?你需要这两列,我没有在图表中看到它们?


0
投票

你试过的主要问题:current user filter is part of left outer join.

要获得您想要的结果,您可以使用 NOT IN 运算符和来自投票的 DISTINCT post_id 来构建您的查询:

SELECT *
FROM posts 
WHERE post_id NOT IN (
     SELECT DISTINCT post_id
     FROM votes
     where user_id = '3' 
)
© www.soinside.com 2019 - 2024. All rights reserved.