SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.04.2015 13:49:59

shark02807
Участник
Зарегистрирован: 21.04.2015
Сообщений: 4

Двойной запрос Left Join

Здравствуйте, уважаемые форумчане!
Бьюсь уже второй день...
Имеется: таблица shop
+----+------------------+
|  id  |        name       |
+----+------------------+
|  1   |        AAA         |
+----+------------------+
|  2   |        BBB         |
+----+------------------+
|  3   |        CCC         |
+----+------------------+
|  4   |        DDD        |
+----+------------------+

таблица parser
+----+------------------+---------+
|  id  |        shop_id    |    sale   |
+----+------------------+---------+
|  1   |        1            |      0     |
+----+------------------+---------+
|  2   |        1            |      0     |
+----+------------------+---------+
|  3   |        1            |     22    |
+----+------------------+---------+
|  4   |        2            |     33    |
+----+------------------+---------+
|  5   |        2            |     44    |
+----+------------------+---------+
|  6   |        3            |     0      |
+----+------------------+---------+
Цель: вывести список магазинов с подсчитанными полем no_sale, где sale=0, и полем sale, где sale!=0
+----+------------------+---------+---------+
|  id  |        name       | no_sale |  sale    |
+----+------------------+---------+---------+
|  1   |        AAA         |     2     |     1     |
+----+------------------+---------+---------+
|  2   |        BBB         |     0     |     2     |
+----+------------------+---------+---------+
|  3   |        CCC         |     1     |     0     |
+----+------------------+---------+---------+
|  4   |        DDD        |     0     |      0     |
+----+------------------+---------+---------+

Пока что дошел до такого запроса:

SELECT
shop.id AS id,
shop.name AS name,
COUNT(p.sale) AS no_sale,
COUNT(ps.sale) AS sale
FROM shop
LEFT JOIN parser p ON shop.id=p.shop_id && p.sale=0
LEFT JOIN parser ps ON shop.id=ps.shop_id && ps.sale!=0
GROUP BY shop.id

Но что-то он немного барахлит, например, для магазина AAA выдает no_sale = 2 и sale = 2

Не могу никак разобраться нормально с синтаксисом, помогите, пожалуйста)

Неактивен

 

#2 21.04.2015 15:23:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Двойной запрос Left Join

SELECT
shop.id AS id,
shop.name AS name,
sum(if(p.sale=0,1,0)) AS no_sale,
sum(if(p.sale=0,0,1)) AS sale,
FROM shop
LEFT JOIN parser p ON shop.id=p.shop_id
GROUP BY shop.id



P.S. не надо дублировать темы

Неактивен

 

#3 21.04.2015 15:59:21

shark02807
Участник
Зарегистрирован: 21.04.2015
Сообщений: 4

Re: Двойной запрос Left Join

Это потрясающе!
Спасибо большое! Даже и не знал о таких функциях в sql.
Правда, не совсем понимаю как это работает...  И когда в parser вообще нет записей, соответствующих какому-то shop, в результате получает no_sale=0 и sale=1.

Прошу прощения за дубль темы, больше не повторится.

Неактивен

 

#4 21.04.2015 16:41:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Двойной запрос Left Join

SELECT
shop.id AS id,
shop.name AS name,
sum(if(p.sale=0,1,0)) AS no_sale,
sum(if(ifnull(p.sale,0)=0,0,1)) AS sale
FROM shop
LEFT JOIN parser p ON shop.id=p.shop_id
GROUP BY shop.id


http://dev.mysql.com/doc/refman/5.5/en/ … unction_if

Неактивен

 

#5 21.04.2015 16:51:03

shark02807
Участник
Зарегистрирован: 21.04.2015
Сообщений: 4

Re: Двойной запрос Left Join

Спасибо большое!
я уже накрутил что-то такое, работающее, но некрасивое)

if(count(p.sale2)=0,0,sum(if(p.sale2=0,0,1))) AS sale,

Но Ваше решение безусловно элегантнее!) Спасибо!)

Отредактированно shark02807 (21.04.2015 16:51:44)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson