【问题标题】:Mysql count, return all fields, if nothing counted return 0Mysql计数,返回所有字段,如果没有计数返回0
【发布时间】:2012-10-27 15:40:24
【问题描述】:

我一直在寻找很多有同样问题的人,但解决方案似乎大不相同?!

我有 3 张桌子:

+-------------------------------------------+
| ITEM: itemid(pk), status(fk), owner(fk)   |
|                                           |
| STATUS: statusid(pk), statusname          |
|                                           |
| OWNER: ownerid(pk), ownername             |
+-------------------------------------------+

我有 2 个状态:1:可用2:损坏

在这种情况下,只有一个所有者拥有一件破损的物品。 我正在使用此代码。首先它是不同的,但似乎 LEFT JOIN 和 GROUP/ORDER BY 应该可以解决问题。对我来说很不幸。

SELECT ownername, SUM(price) AS  'totalbrokenpriceeach', COUNT( itemid ) AS  'totalbrokenitemseach'
                                FROM item
                                LEFT JOIN owner ON item.owner = owner.ownerid
                                LEFT JOIN status on item.status = status.statusid
                                WHERE statusid='2'
                                GROUP BY ownerid

这会返回:

ownername   totalbrokenpriceeach    totalbrokenitemseach
Owner #1            60                          1
Owner #5            180                         4

我想返回:

ownername   totalbrokenpriceeach    totalbrokenitemseach
Owner #1            60                          1
Owner #2            0                           0
Owner #3            0                           0
Owner #4            0                           0
Owner #5            180                         4

怎么办?大家有什么解决办法吗?



编辑:

         OWNER                          
+-----------------------+
| ownerid ownername     |
|     1:    Henk        |
|     2:    Jan         |
|     3:    Piet        |
|     4:    Klaas       |
+-----------------------+

         STATUS
+-----------------------+
| statusid statusbeschr |
|     1:    Available   |
|     2:    Broken      |
+-----------------------+

         ITEM
+--------------------------------------+
| itemid    price     owner     status |
|     1:    90          1          1   |
|     2:    40          2          1   |
|     3:    20          2          1   |
|     4:    120         3          2   |
+--------------------------------------+

I need returned:

+-------------------------------------------------------+
| ownername    SumOfBrokenItems   AmountOfBrokenItems   |
|     Henk:       0                       0             |
|     Jan:        0                       0             |
|     Piet:       120                     1             |
|     Klaas:      0                       0             |
+-------------------------------------------------------+

【问题讨论】:

  • 尝试将第一个 LEFT JOIN 更改为 RIGHT JOIN。
  • 我试过了,右,右外,左,左,外,左内,甚至将两者结合起来,直到 sql 开始发牢骚:P
  • 我的错,我认为状态是来自所有者的列,而不是项目。

标签: mysql count null return zero


【解决方案1】:

罢工>

SELECT  a.ownername, 
        SUM(price) AS  totalbrokenpriceeach, 
        COUNT(b.itemid) AS  totalbrokenitemseach
FROM    owner a
        LEFT JOIN   item b
            ON a.ownerID = b.owner
        LEFT JOIN   status c
            ON b.status = c.statusID AND 
               c.StatusID = 2
GROUP BY    ownername

更新 1

SELECT  a.ownername, 
        SUM(CASE WHEN c.statusbeschr = 'Broken' THEN b.price ELSE 0 END) AS  totalbrokenpriceeach, 
        SUM(CASE WHEN c.statusbeschr = 'Broken' THEN 1 ELSE 0 END) AS  totalbrokenitemseach
FROM    owner a
        LEFT JOIN   item b
            ON a.ownerID = b.owner
        LEFT JOIN   status c
            ON b.status = c.statusID        
GROUP BY a.ownerid
ORDER BY a.ownerid

【讨论】:

  • 这会将所有字段与值一起计算。只需要状态 2,如果没有找到状态 = 2,则返回 0 与所有者。
  • @IvanM 你能在你的问题上添加示例记录吗?
  • 你看到小提琴了吗?和你想要的一样。
  • 天哪!我知道了。我写了BROKEN,它应该是另一种语言!非常感谢 =D=D+D+D
  • 可能与您表中的记录有关。嘿嘿怪怪的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2018-11-19
  • 2016-02-21
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多