这是一个投票系统,候选人可以从不同(有限)的地方投票。我想要每个候选人的每个地方的投票数。 我有3张桌子
TABLE candidate
------------------
id
name
TABLE place
------------------
id
label
TABLE vote
------------------
id
id_candidate
id_vote
no_votes // represents the amount of votes in this place for that particular candidate
假设我有10个候选人和15个不同的地方,我正在尝试进行查询,即使没有投票也将返回10 * 15 = 150行,保留关系表中不存在的ID的NULL值(我可以用0代替)。
但我没有做出正确的查询 这是我到目前为止所做的查询(我尝试了许多修改,内部,外部联接......但没有任何效果)
SELECT *
FROM votes
RIGHT JOIN candidate ON candidate.id = candidate_id
LEFT JOIN palce ON place.id = place_id
答案 0 :(得分:1)
首先,如果你想要每个候选人的投票数,那么你应该考虑"聚合"。
其次,不要在查询中混合左右连接。这简直令人困惑。从要保留所有行的表开始,然后使用left join
。
所以,像这样:
SELECT c.*,
SUM(p.place_name = 'place1') as place1,
SUM(p.place_name = 'place2') as place2,
SUM(p.place_name = 'place3') as place3
FROM candidate c LEFT JOIN
votes v
ON c.id = v.candidate_id LEFT JOIN
place p
ON p.id = v.place_id
GROUP BY c.id;
答案 1 :(得分:1)
考虑到:
TABLE vote
------------------
id PK
id_candidate FK to candidate
id_vote FK to place
no_votes
-
SELECT CA.name,
PL.label,
SUM(VO.no_votes) as votes
FROM candidate CA
LEFT JOIN vote VO ON CA.id = VO.id_candidate
LEFT JOIN place PL ON PL.id = VO.id_vote
GROUP BY CA.id, PL.id