我有一个三表设置:孩子们,玩具和游戏,每个都有独特的主键:id_kid,id_toy和id_game。每个孩子可以有多个玩具和游戏,但每个玩具或游戏只有一个孩子。MySQL使用总和和左连接加倍结果
的玩具和游戏有3个状态买走列:1,0,1 表结构是这样的:
kids
id_kid
kid_name
etc
games
id_game
id_kid_games --> links with id_kid in kids_table (maybe not the best name, I know)
game_name
bought --> can be -1,0,1
toys
id_toy
id_kid_toys --> links with id_kid in kids_table
toy_name
bought --> can be -1,0,1
对于每个孩子我试图得到一个总的玩具和游戏,买和不买的,使用下面的查询,但结果一倍:
SELECT kids.*,
COUNT(DISTINCT toys.id_toy) AS total_toys,
SUM(CASE toys.bought WHEN 1 THEN 1 ELSE 0 END) AS toys_bought,
SUM(CASE toys.bought WHEN -1 THEN 1 ELSE 0 END) AS toys_not_bought,
COUNT(DISTINCT games.id_game) AS total_games,
SUM(CASE games.bought WHEN 1 THEN 1 ELSE 0 END) AS games_bought,
SUM(CASE games.bought WHEN -1 THEN 1 ELSE 0 END) AS games_not_bought
FROM kids as k
LEFT JOIN toys t ON k.id_kid = t.id_kid_toys
LEFT JOIN games g ON k.id_kid = g.id_kid_games
GROUP BY k.id_kid
ORDER BY k.name ASC
一个孩子已经2个玩具和4场,都买了,结果是2层总的玩具(正确)总共4款游戏(正确),购买8款玩具,购买8款游戏。 (都是错误的)
请帮忙做出答案 - 如果可能的话 - 不使用子查询。 谢谢。
你可以发布每个表的样本数据以及表结构吗? – Taryn
@bluefeet我编辑了这个问题,并试图解释表结构。谢谢。 – noru
谢谢你,你可以发布一些样本数据? – Taryn