我有 3 个 MySQL 表:
特性表:
id name
----------
1 feature 1
2 feature 2
3 feature 3
4 feature 4
5 feature 5
投票表:
userid featureid
----------------
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
4 1
用户表:
id name
--------
1 John
2 Alice
3 Bob
4 Mark
5 Jane
6 Mary
7 Ann
我需要在单个查询中获取:
- 总是所有功能,无论他们是否有投票权
- 无论投票数如何,每个功能都必须仅列出一次,即使它没有投票
- 列出的每个功能的投票计数
- 如果当前登录的用户投票支持列表中的当前功能,则为特殊标记 - 例如,如果用户 3 已登录,则列出所有用户的投票计数的所有功能,如果用户 3 投票支持某些功能有一个特殊字段指示他的投票或如果他没有,则为 NULL(投票表中的其他数据也必须包含在内,因此需要左连接)
到目前为止,我这样做了:
SELECT *,(SELECT COUNT(*) FROM votes WHERE votes.featureid=features.id) AS "votecnt"
FROM features
LEFT JOIN votes ON votes.featureid=features.id
LEFT JOIN users ON users.id=votes.userid
GROUP BY features.id
如果用户 3 投票,它会列出所有功能,但没有特殊字段。我尝试了 IF,各种 WHERE 条件,经过多次尝试......没有想法了。
所需的输出可能如下所示:
features.id features.name votes.userid votes.otherfields users.id users.name
1 feature 1 4 - 4 Mark
2 feature 2 NULL - NULL NULL
3 feature 3 NULL - NULL NULL
4 feature 4 NULL - NULL NULL
5 feature 5 NULL - NULL NULL
列出了所有功能,只有用户 4 投票的功能才填充了其他连接表,其他的只是 NULL。如果其他人投票支持功能 2,它仍然为 NULL,因为它与用户 4 无关,因为在此示例中用户 4 已登录。
这是问题所在:
http://sqlfiddle.com/#!2/c3d10/3
http://sqlfiddle.com/#!2/c3d10/4
http://sqlfiddle.com/#!2/c3d10/5
http://sqlfiddle.com/#!2/c3d10/6
http://sqlfiddle.com/#!2/c3d10/7
SQLFiddle 中的所有上述查询都应输出所有 5 个功能,而不管用户 ID 是什么。因此,必须以某种方式修改查询以显示所有功能 - 即使其他人投票支持某个功能,或者如果没有投票,或者当前用户投票支持该功能。