MySQL считается, когда значение не равно - PullRequest
1 голос
/ 11 марта 2019

У меня есть несколько таблиц.1.регион 2. ресторан 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;

Здесь ямогу получить items_with_pro_pic по кол-ву (restaurant_items.pro_pic), но я не могу сделать это для items_with_featured_pic, потому что featured_pic не имеет нулевого значения, если нет значения по умолчанию. default.jpg.Поэтому я попробовал count(restaurant_items.featured_pic != 'defaut.jpg'), но у меня это не работает.

И как я могу получить количество ресторанов, поскольку оно не входит в таблицу restaurant_items?

Как мне этого добиться?двое используют MySQL?

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Вы можете использовать выражение case для получения null с вместо default.jpg для использования в функции count:

SELECT     region.name, 
           COUNT(restaurant_items.id) as total_items,
           COUNT(restaurant_items.pro_pic),
           COUNT(CASE WHEN restaurant_items.featured_pic != 'default.jpg' THEN 1 END)
INNER JOIN restaurant ON restaurant_items.restaurant_id = restaurant.id
INNER JOIN region ON restaurant.region_id = region.id
GROUP BY   region.name;
1 голос
/ 11 марта 2019

Вы можете изменить COUNT на SUM и запустить его через оператор IF:

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

Или, в качестве альтернативы, вы можете указать его как COUNT, если хотите, но часть ELSE должна быть NULL, а не 0, так как в противном случае она все равно будет считать его:

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

Чтобы подсчитать количество ресторанов, вы можете просто сделать отдельный подсчет:

COUNT(DISTINCT restaurant.id)

Несколько небольших дополнительных советов:

  • Возможно, вы захотите изменить имя restaurant_items на restaurant_item, поскольку это соответствует соглашению об именах других таблиц
  • Вы должны использовать псевдонимы таблиц в предложениях FROM и JOIN, так как это улучшает читабельность кода
1 голос
/ 11 марта 2019

вариант использования, когда

    SELECT region.name, count(restaurant_items.id) as total_items, count(restaurant_items.pro_pic),
    count(case when restaurant_items.featured_pic != 'defaut.jpg' then 1 end) as 
    items_with_featured_pic,
    count(case when pro_pic is null then 1 end) as 
    items_with_pro_pic_null
    INNER JOIN restaurant on restaurant_items.restaurant_id = restaurant.id
    INNER JOIN region on restaurant.region_id = region.id
    GROUP BY region.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...