我有3个MySQL表:计票,如果用户在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(其他数据来自投票表也必须包含,因此它需要被LEFT JOINED)
到目前为止,我这样做:
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个功能,而不管用户标识符如何。因此,查询必须以某种方式进行修改才能显示所有功能 - 即使其他人投票选择了功能,或者如果没有投票或当前用户投票选择功能。
你能以表格形式显示你想要的结果吗? – 2013-03-20 03:18:44
sqlfiddle.com和您想要的结果 – Martin 2013-03-20 03:26:01
'features.id = 4'仅由一个人投票,现在如果某个功能被多个用户投票,那么'votes.userid'看起来会怎样? CSV上的ID?如果'users.id = 3'登录了怎么办?结果是什么? – 2013-03-20 03:30:27