SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 04.10.2012 15:16:32

Dimetriy
Участник
Зарегистрирован: 04.10.2012
Сообщений: 2

Помогите с запросом

Здравствуйте. Вопрос на 33 засыпки.

Есть 2 таблицы.
1. giftcards (gc_order_id - autoincrement, primary)
2. giftcards_order (gc_card_id (ai,primary), gc_order_id, gc_value (ENUM 500,1000,3000,5000)

Задача.
Это понятно упрощенно. Там есть еще поля.
Задача: Выбрать из giftcards все записи и посчитать количество записей из второй таблицы для каждого из существующих gc_value
соотнося их по gc_order_id

То есть во второй таблице может быть такие данные
1;1;500
2;1;500
3;1;1000
4;1;3000
5;1;5000
6;1;3000

Должно получиться что то вида
gc_order_id(1),count_value_500(2),count_value_1000(1),count_value_3000(2),count_value_5000(1)

Делаю вот такой вот финт ушами:

SELECT g.gc_order_id,
             COUNT(o500.gc_order_id) as num_gc500,
             COUNT(o1000.gc_order_id) as num_gc1000,
             COUNT(o3000.gc_order_id) as num_gc3000,
             COUNT(o5000.gc_order_id) as num_gc5000
      FROM (giftcards AS g)
      LEFT JOIN (giftcards_orders AS o500)
      ON (o500.gc_order_id=g.gc_order_id
      AND o500.gc_value='500')
      LEFT JOIN (giftcards_orders AS o1000)
      ON (o1000.gc_order_id=g.gc_order_id
      AND o1000.gc_value='1000')
      LEFT JOIN (giftcards_orders AS o3000)
      ON (o3000.gc_order_id=g.gc_order_id
      AND o3000.gc_value='3000')
      LEFT JOIN (giftcards_orders AS o5000)
      ON (o5000.gc_value='5000'
      AND o5000.gc_order_id=g.gc_order_id)
     
      GROUP BY gc_order_id


И оно не работает. Точнее работает, но не так как нужно:
Если в таблице по определенному value нет записей - то пишет как и нужно 0, если только один тип value (например 1000) - то считает нормально, остальное 0 ставит. А вот если несколько разных типов - то начинается феерический писец и я даже логику его подсчетов не могу понять.
например при значениях 500(1), 1000(2), 5000(5) оно выдает

array (size=10)
  0 => string '5' (length=1)
  'id' => string '5' (length=1)
  1 => string '10' (length=2)
  'num_gc500' => string '10' (length=2)
  2 => string '10' (length=2)
  'num_gc1000' => string '10' (length=2)
  3 => string '0' (length=1)
  'num_gc3000' => string '0' (length=1)
  4 => string '10' (length=2)
  'num_gc5000' => string '10' (length=2)



Вобщем как сделать то?

Неактивен

 

#2 04.10.2012 15:35:50

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

Re: Помогите с запросом

Пардон, глупость прошлый раз написал.

Вам нужно
SELECT g.gc_order_id, SUM(IF(gc_value=500,1,0)) as num_gc500, ...
FROM giftcards g LEFT JOIN giftcards_orders o ON o.gc_order_id=g.gc_order_id GROUP BY gc_order_id;

Неактивен

 

#3 04.10.2012 16:02:44

Dimetriy
Участник
Зарегистрирован: 04.10.2012
Сообщений: 2

Re: Помогите с запросом

Спасибо. В итоге он такой

SELECT g.gc_order_id,
             SUM(IF(o.gc_value='500',1,0)) as num_gc500,
             SUM(IF(o.gc_value='1000',1,0)) as num_gc1000,
             SUM(IF(o.gc_value='3000',1,0)) as num_gc3000,
             SUM(IF(o.gc_value='5000',1,0)) as num_gc5000
             FROM (giftcards AS g)
             LEFT JOIN (giftcards_orders AS o)
             USING (gc_order_id)
             GROUP BY gc_order_id

Неактивен

 

#4 10.10.2012 18:06:14

sergus
Участник
Зарегистрирован: 10.10.2012
Сообщений: 1

Re: Помогите с запросом

Прошу помоч есть запрос:

SELECT     _sMU.IDMU AS Expr2, PolisMU.IDMU AS Expr1, _sMU.Name AS Expr3, _sMU.code AS Expr4, _sMU.*
FROM         _sMU INNER JOIN
                      PolisMU ON _sMU.IDMU = PolisMU.IDMU



появляется список в катором нужно количество записей соответствующие полю _sMU.Name ,а не список всех записей индивидуально.

Извените может чуток не понятно объясняю.

Неактивен

 

#5 10.10.2012 23:34:28

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

Re: Помогите с запросом

Совсем не понятно.
Приведите набор тестовых данных и желаемый результат. Или переформулируйте подробнее задачу.

Неактивен

 

Board footer

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