我有 2 个 MySQL 表,即
posts
和 votes
我想获得所有帖子有或没有被当前用户投票。
我应该写什么样的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
存储外部表的值,即 post 和 user。 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 (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';
非常感谢您的时间和解决方案!
例如:
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 与作者无关?你需要这两列,我没有在图表中看到它们?
你试过的主要问题: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'
)