MySQL连接n到n关系表keping NULL值

时间:2015-11-11 10:21:20

标签: mysql sql join relational-database left-join

这是一个投票系统,候选人可以从不同(有限)的地方投票。我想要每个候选人的每个地方的投票数。 我有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 

2 个答案:

答案 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