需要多个联接的MySQL查询
我有一个记录孩子行为的系统。如果孩子淘气,则记录为负面;如果孩子行为良好,则记录为正面 例如,如果一个孩子粗鲁无礼,他会得到一个“粗鲁”的负数,并以负x点记录在系统中 我的结构可以在这把小提琴上看到- 在需要多个联接的MySQL查询,mysql,Mysql,我有一个记录孩子行为的系统。如果孩子淘气,则记录为负面;如果孩子行为良好,则记录为正面 例如,如果一个孩子粗鲁无礼,他会得到一个“粗鲁”的负数,并以负x点记录在系统中 我的结构可以在这把小提琴上看到- 在users\u rewards\u logged表中,rewards\u id列是一个外键,根据列的类型链接到扣减或成就表。 如果类型为1,则为扣减奖励,如果类型值为2,则为成就奖励 我基本上需要一个查询来列出如下内容: +------------------------------+
users\u rewards\u logged
表中,rewards\u id
列是一个外键,根据列的类型链接到扣减或成就表。
如果类型为1,则为扣减奖励,如果类型值为2,则为成就奖励
我基本上需要一个查询来列出如下内容:
+------------------------------+
| reward | points | count |
+------------------------------+
| Good Work | 100 | 1 |
| Rude | -50 | 2 |
+------------------------------+
因此,它汇总数字并根据类型匹配奖励(1是扣减,2是成就)
基于sqlfiddle,什么是实现这一点的好方法?尽管eggyal是正确的——这对您的数据来说是相当糟糕的设计——您所要求的可以实现,但需要一个UNION子句:
SELECT users_achievements.name, users_rewards_logged.points, COUNT(*)
FROM users_rewards_logged
INNER JOIN users_achievements ON users_achievements.achievement_id = users_rewards_logged.reward_id
WHERE users_rewards_logged.type = 2
UNION
SELECT users_deductions.name, users_rewards_logged.points, COUNT(*)
FROM users_rewards_logged
INNER JOIN users_deductions ON users_deductions.deduction_id = users_rewards_logged.reward_id
WHERE users_rewards_logged.type = 1
GROUP BY 1, 2
没有理由不合并成绩表和扣减表,只使用不冲突的代码。如果合并这些表,则不再需要UNION子句——查询会简单得多。我注意到您有两个表(
users\u declutations
和users\u congregations
)定义奖励的类型。正如@eggyal所说,您违反了正交设计的原则,这导致您的模式缺乏规范化
因此,我将users\u declutations
和users\u congregations
两个表合并到一个名为return\u type
的表中
结果是这样的:这里有一个查询,可以获得上述所需的结果:
SELECT COALESCE(ua.name, ud.name) AS reward,
SUM(url.points) AS points, COUNT(url.logged_id) AS count
FROM users_rewards_logged url
LEFT JOIN users_deductions ud
ON ud.deduction_id = url.reward_id
AND url.type = 1
LEFT JOIN users_achievements ua
ON ua.achievement_id = url.reward_id
AND url.type = 2
GROUP BY url.reward_id, url.type
您的SQLFiddle的点
和类型
的顺序对于记录的表用户\u奖励
是错误的
以下是修复结果:
reward points count
Good Work 100 1
Rude -50 2
FKs不能用于多个表(如果您让MySQL强制执行约束,您会发现无法定义)——这违反了。最好将您的
users\u成就
和users\u扣减
表组合起来,以便记录users\u奖励。奖励id
是FK,可以包含一列,指示每个奖励是成就还是扣减(我建议使用一个分别包含1和-1的points
列,这样就可以只进行join、group和sum).所以,它不是真的被孩子们使用!我同意-设计不是很好,它是一个遗留的设计,所以不能真正修改表结构的时候moment@Zabs,如果您只想在现有设计中使用好的方法,则应在问题中说明。@Marcus抱歉,我本应提到这一点,但所有注释仍然有效且有用:-)不需要工会。另外,检查GROUPBY子句。按1、2分组是什么意思?而且,似乎你希望整个联盟都团结起来。如果有一个以上的成就或推论,会发生什么?很棒的东西,伙计们,这看起来很划算-在某个时候,我可能会考虑修改数据库结构,但现在这正是我需要的。再次感谢