需要多个联接的MySQL查询

需要多个联接的MySQL查询,mysql,Mysql,我有一个记录孩子行为的系统。如果孩子淘气,则记录为负面;如果孩子行为良好,则记录为正面 例如,如果一个孩子粗鲁无礼,他会得到一个“粗鲁”的负数,并以负x点记录在系统中 我的结构可以在这把小提琴上看到- 在users\u rewards\u logged表中,rewards\u id列是一个外键,根据列的类型链接到扣减或成就表。 如果类型为1,则为扣减奖励,如果类型值为2,则为成就奖励 我基本上需要一个查询来列出如下内容: +------------------------------+

我有一个记录孩子行为的系统。如果孩子淘气,则记录为负面;如果孩子行为良好,则记录为正面

例如,如果一个孩子粗鲁无礼,他会得到一个“粗鲁”的负数,并以负x点记录在系统中

我的结构可以在这把小提琴上看到-

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分组是什么意思?而且,似乎你希望整个联盟都团结起来。如果有一个以上的成就或推论,会发生什么?很棒的东西,伙计们,这看起来很划算-在某个时候,我可能会考虑修改数据库结构,但现在这正是我需要的。再次感谢