"having Group by" Такое возможно ?

botan

Новичок
"having Group by" Такое возможно ?

После долги многоджойновых запросов получилается некая табличка.
Использую having id>100 можно оставить в ней все id>100.
А можно как-нибудь сгрупировать полученную таблицу по одному из полей?
 

slach

Новичок
только если делать
CREATE TEMPORARY TABLE ... SELECT много JOIN

а потом из нее
SELECT * FROM tmp_table GROUP BY blabla;

HAVING в SELECT SQL statement по документации идет ПОСЛЕ GROUP BY ...
ибо выполняется над сформированным рекордсетом...
доку смотреть вот тут
http://dev.mysql.com/doc/mysql/en/SELECT.html
 

botan

Новичок
:)
Тогда задача:
Есть заказы (orders) в каждом - несколько товаров (order_items). Заказы бывают оплаченные и неоплаченные - за это рулит поле is_payed. Требуется посчитать общую суму оплаченных и неоплаченных заказов.
Делаю так
[SQL] select sum(if(is_payed=1,order_items.price,0)) as payed,sum(if(is_payed=0,order_items.price,0)) as unpayed from orders INNER JOIN order_items using(order_id) where ..
GROUP by order_id
[/SQL]
Так я вижу в рамках каждого заказа либо его "оплаченную стоимость" либо его "неоплаченную стоимость".

Ситуация усугубляется ещё и тем, что каждый заказ привязан к какому-то складу (есть таблица warehouses связанная с таблицей orders по warehouse_id). И надо выдавать эти сумы сгрупированные по складам.

Если бы в таблице хранилось поле "сумма заказа" (orders.cost) - проблем бы не было, масса вариантов.
[SQL] select sum(if(is_payed=1,orders.cost,0)) as payed,sum(if(is_payed=0,orders.cost,0)) as unpayed from orders INNER JOIN warehouse USINNG(warehouse_id) where
GROUP by warehouse_id
[/SQL]
 

alexhemp

Новичок
А что мешает поджойнить их все вместе? И уже все вместе обсчитать?

Что-то вроде
SELECT w.name,
sum( IF (o.is_payed = 1, oi.cost, 0) ) AS payed,
sum( IF (o.is_payed = 0, oi.cost, 0) ) AS unpayed
FROM orders o
INNER JOIN warehouse w ON (w.warehouse_id = o.warehouse_id)
INNER JOIN order_items oi ON (oi.order_id = o.order_id)
WHERE ...
GROUP BY w.warehouse_id

Или я задачу не понял?
 

botan

Новичок
попробовав, был очень удивлен результатом работы
IF (o.is_payed = 1, oi.cost, 0)
она, почему то, считает o.is_payed в рамкахъ одного склада считается ОДИНАКОВОЙ, и не изменяеются от заказа к заказу.
Что очень напрягает.
Если надо - могу показать весь запрос целиком. Но там штук 6 джойнофф...
 

alexhemp

Новичок
botan

ты убери SUM GROUP BY и посмотри на весь рекордсет. И давай сюда весь запрос. :)

Идея-то простая, сперва получи искомое множество, а потом его групируй...
 

botan

Новичок
я безумно извиняюсь, но весь запрос остался на работе, а я в отупуске :)
через CREATE TEMPORARY TABLE SELECT всё просто делается.
Сначало групирую по заказам. а потом сумирую.
Но вообще интересно узнать чё бы это он там, MySQL :)
 
Сверху