【问题标题】:Sum on MySQL left join with relation 1:XMySQL左连接的总和与关系1:X
【发布时间】:2016-08-24 17:57:02
【问题描述】:

好的,首先,我要更改表、字段和值的名称,我只是保留我的数据库的结构以供您理解。

现在,假设我有一个表people,其中包含idagecountrylanguage 字段。还有另一张桌子foods,桌子上的每个人都吃过食物people,字段:person_idfoodunits。 注意:foodchar,不是另一个表的 ID,我无法更改此结构。

现在,让我们放一些数据:

.

ID | AGE | COUNTRY | LANGAGE
1  |  25 |   usa   |  en
2  |  46 |   mex   |  es

.

食物

ID | PERSON_ID | FOOD  | UNITS
1  |     1     | apple |   2
2  |     1     | grape |  24
3  |     1     | pizza |   1
4  |     2     | apple |   3
5  |     2     | pizza |   2

.

好的,我需要得到idagecountry 以及applegrape 的总和被一个人吃掉(忽略pizza)。在这个例子中,如果我查找 ID 1,我应该得到:

ID | AGE | COUNTRY | UNITS 
1  |  25 |   usa   | 26

对于 ID 2:

ID | AGE | COUNTRY | UNITS 
2  |  46 |   mex   | 3

【问题讨论】:

  • 根据现有数据,第 1 个人和第 2 个人的单位不应该分别是 26 和 3 吗?

标签: mysql


【解决方案1】:

http://sqlfiddle.com/#!9/38304/2

SELECT p.*, SUM(f.units)
FROM people p
LEFT JOIN foods f
ON f.person_id = p.id
  AND f.food in('apple','grape')
GROUP BY p.id

【讨论】:

    【解决方案2】:
    select p.id, p.age, p.country, sum(f.units) as units
    from people p join foods f
    on (p.id = foods.person_id and f.food in ('apple', 'grape'))
    group by p.id, p.age, p.country
    

    如果您需要其他食物组合,只需编辑in 子句的内容即可。

    【讨论】:

      【解决方案3】:
      SELECT p.Id, p.Age,p.country, sum(f.units)
      FROM people AS p
      INNER JOIN foods AS f ON f.person_id = p.id
      WHERE f.food <> 'Pizza'
      GROUP BY p.id,p.age,p.country
      

      【讨论】:

      • 好吧,我有很多不同的food,所以,我会尝试WHERE f.food = 'apple' OR f.food = 'grape' 而不是WHERE f.food &lt;&gt; 'Pizza',另外,它需要是left join 而不是@987654327 @但我没有具体说明我的消息正文。无论如何,我明白了你的想法,诀窍在于 GROUP BY。我会努力回来的。
      • 不用担心,您可以轻松地将其更改为左连接,我会将 where 子句更改为 WHERE f.food IN ('apple','grape'),这样您就不必继续添加 OR 语句
      • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit你的答案添加一些解释。
      【解决方案4】:
      select 
      t1.id, t1.age, t1.country, sum(t2.units)
      from people as t1, foods as t2
      where 
      t1.id = t2.person_id and t2.food != 'pizza'
      group by t1.id 
      order by t1.id
      

      【讨论】:

        【解决方案5】:
        select p.id, p.age, p.country, sum(f.units) as units 
        from people p 
        join foods f on f.person_id = p.id 
        where f.food <> 'Pizza' 
        group by p.id, f.food
        

        【讨论】:

        • 你确定f.food
        • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit你的答案添加一些解释。
        • 你需要每人的食物总消耗量,还是每人消耗的总食物量?
        猜你喜欢
        • 1970-01-01
        • 2015-04-04
        • 2016-08-25
        • 1970-01-01
        • 2013-08-25
        • 2012-04-15
        • 1970-01-01
        • 2019-05-19
        • 2011-08-23
        相关资源
        最近更新 更多