首页 > 解决方案 > 值不相等时的MySQL计数

问题描述

我有几张桌子。1.region 2.restaurant 3.restaurant_itmes

地区

id | name
................
1  | NY
2  | Paris
3  | London

餐厅

id | name     | region_id
.........................
1  | KFC      | 1
2  | McDonals'| 1
3  | La res   | 2
4  | Queen's  | 3

restaurant_items

id | name | restaurant_id | pro_pic   | featured_pic
...................................................
1  |Pizza |3              | null      | defaut.jpg
2  |Pizza |4              | pizza.jpg | defaut.jpg
3  |Burger|1              | burger.jpg| burger.jpg
4  |Burger|2              | burger.jpg| burger.jpg
5  |Burger|3              | null      | burger.jpg
6  |Burger|4              | null      | default.jpg
7  |Donat |2              | null      | default.jpg
8  |Fries |2              | null      | default.jpg

我想生成一个查询来填充这个表

region  |Number of restaurants  |total items | items_with_pro_pic | items_with_featured_pic
............................................................................................
NY      |   2                  |    4       |       2             | 2
Paris   |   1                  |    2       |       0             | 1
London  |   1                  |    2       |       1             | 0

我到目前为止所做的是

SELECT region.name, count(restaurant_items.id) as total_items, count(restaurant_items.pro_pic)
INNER JOIN restaurant on restaurant_items.restaurant_id = restaurant.id
INNER JOIN region on restaurant.region_id = region.id
GROUP BY region.name;

在这里,我可以通过 count(restaurant_items.pro_pic) 获取 items_with_pro_pic,但我不能为 items_with_featured_pic 执行此操作,因为如果没有值默认值是 default.jpg,那么 features_pic 不能为空。所以我尝试count(restaurant_items.featured_pic != 'defaut.jpg')了,但这对我不起作用。

既然它不是 restaurant_items 表的一部分,我怎么能得到餐厅的数量?

如何使用 MySQL 实现这两个?

标签: mysqlsqlselectcount

解决方案


您可以将其更改COUNT为 aSUM并在 IF 语句上运行它:

SUM(IF(restaurant_items.featured_pic != 'default.jpg',1,0))

或者,COUNT如果需要,您可以将其指定为 a,但 ELSE 部分需要为 NULL 而不是 0,否则它仍然会计算它:

COUNT(IF(restaurant_items.featured_pic != 'default.jpg',1,NULL))

要计算餐厅的数量,您可以简单地进行不同的计数:

COUNT(DISTINCT restaurant.id)

一些额外的小提示:

  • 您可能希望将“restaurant_items”的名称更改为“restaurant_item”,因为这符合其他表的命名约定
  • 您应该在 FROM 和 JOIN 子句中为您的表名起别名,因为它提高了代码的易读性

推荐阅读