Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / GROUP BY и GROUP_CONCAT с условием / 7 сообщений из 7, страница 1 из 1
25.11.2013, 17:20:01
    #38477060
saxap
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY и GROUP_CONCAT с условием
Доброго времени суток ув. Эксперты!
Пожалуйста помогите решить следующую задачу:
Написал вот такой сложный запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT o.order_id, o.email, o.firstname, o.lastname, os.name as status, o.date_added, o.total, o.currency_code, o.currency_value, op.product_id, COUNT(op.product_id) AS qua, op.order_id, ch.status, GROUP_CONCAT(o.order_id ORDER BY o.order_id ASC SEPARATOR '|') AS arr, p.pricenorm
FROM `order` o
LEFT JOIN order_status os ON (o.order_status_id = os.order_status_id)
INNER JOIN order_product op ON (o.order_id = op.order_id)
INNER JOIN product p ON (op.product_id = p.product_id)
LEFT JOIN coupon_history ch ON (o.order_id = ch.order_id)
WHERE o.customer_id = '4358' AND o.order_status_id > '0' AND os.language_id = '1'
GROUP BY op.product_id, ch.status
ORDER BY o.order_id 
DESC LIMIT 0,1000



Его результат:



Подскажите как добавить 2 условия, чтобы группировка по product_id и склеивание arr происходило только если pricenorm не было равно 0 и status был не равен 1, причем чтобы status = 0 и status = NULL считалось за одно и то же.

Буду благодарен за любую подсказку!
Спасибо!
...
Рейтинг: 0 / 0
25.11.2013, 18:20:46
    #38477163
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY и GROUP_CONCAT с условием
1)
Код: sql
1.
LEFT JOIN order_status os

+
Код: sql
1.
WHERE o.customer_id = '4358' AND o.order_status_id > '0' >>>AND os.language_id = '1'<<

=не левый джойн, а обычный

2)
Код: sql
1.
LEFT JOIN coupon_history ch

+
Код: sql
1.
GROUP BY op.product_id, ch.status

="все продукты, у которых не нашлось истории, будут слеплены в кучу". Вы точно этого хотите?

3)
Код: sql
1.
SELECT o.order_id, o.email

+
Код: sql
1.
GROUP BY op.product_id, ch.status

А за такое вообще бьют канделябрами!

4)saxapгруппировка по product_id см. выше - сначала сделайте нормальную группировку, потом уже будем думать, как на неё навешивать условия

5)saxapсклеивание arr происходило только если pricenorm не было равно 0 и status был не равен 1, причем чтобы status = 0 и status = NULL считалось за одно и то же.ну например
Код: sql
1.
GROUP_CONCAT(case when  pricenorm<>0 and ifnull(status,0)<>1 then o.order_id else null end ORDER BY o.order_id ASC SEPARATOR '|') AS arr

но пока вы не разберётесь с предыдущими косяками, это ничем не поможет...
...
Рейтинг: 0 / 0
25.11.2013, 20:35:09
    #38477290
saxap
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY и GROUP_CONCAT с условием
1) Поставил обычный джоин, спасибо.
2) Хочу, но не совсем так - хочу чтобы продукты, у которых pricenorm = 0 - всегда были раскученные, а если pricenorm != 0, то скучивались сначала по одинаковому product_id , потом, если в этой куче присутствуют разные status , то они раскучивались так: у тех продуктов где status = 0 или = NULL - остались в этой куче, а со status = 1 - раскучились по уникальному order_id в каждой строке. (3 последние строки расгруппировались)
3) Разжуйте пожалуйста за что побили =) В таблице о нет столбца с product_id , если вы об этом.. или смысл в не верном порядке полей в выборке?
4) ...
5) С такой проверкой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT o.order_id, o.email, o.firstname, o.lastname, os.name AS 
STATUS , o.date_added, o.total, o.currency_code, o.currency_value, op.product_id, COUNT( op.product_id ) AS qua, ch.status, GROUP_CONCAT( 
CASE WHEN p.pricenorm <>0
AND IFNULL( ch.status, 0 ) <>1
THEN o.order_id
ELSE NULL 
END ORDER BY o.order_id ASC 
SEPARATOR  '|' ) AS arr, p.pricenorm
FROM  `order` o
JOIN order_status os ON ( o.order_status_id = os.order_status_id ) 
INNER JOIN order_product op ON ( o.order_id = op.order_id ) 
INNER JOIN product p ON ( op.product_id = p.product_id ) 
LEFT JOIN coupon_history ch ON ( o.order_id = ch.order_id ) 
WHERE o.customer_id =  '4358'
AND o.order_status_id >  '0'
AND os.language_id =  '1'
GROUP BY op.product_id, ch.status
ORDER BY o.order_id DESC 
LIMIT 0 , 1000



получилось:



По сути мне нужно чтобы строки где arr = NULL разгруппировались, а 1 и 2 строка сгруппировались..
...
Рейтинг: 0 / 0
25.11.2013, 22:21:09
    #38477365
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY и GROUP_CONCAT с условием
saxap,

соотношение между arr=null и arr<>0 каково в выборке? Может какой-нить union упростит решение, нет? :)
...
Рейтинг: 0 / 0
26.11.2013, 06:17:19
    #38477571
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY и GROUP_CONCAT с условием
saxapРазжуйте пожалуйста за что побили =) 13173672
saxapпродукты, у которых pricenorm = 0 - всегда были раскученные, а если pricenorm != 0, то скучивались сначала по одинаковому product_id , потом, если в этой куче присутствуют разные status , то они раскучивались так: у тех продуктов где status = 0 или = NULL - остались в этой куче, а со status = 1 - раскучились по уникальному order_id в каждой строкеArhat109Может какой-нить union упростит решениелюто, бешено плюсую :)
...
Рейтинг: 0 / 0
26.11.2013, 09:28:49
    #38477646
saxap
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY и GROUP_CONCAT с условием
Arhat109,

arr вообще не равно null, равным null он стал после

Код: sql
1.
GROUP_CONCAT(case when  pricenorm<>0 and ifnull(status,0)<>1 then o.order_id else null end ORDER BY o.order_id ASC SEPARATOR '|') AS arr
...
Рейтинг: 0 / 0
26.11.2013, 11:10:04
    #38477817
saxap
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY и GROUP_CONCAT с условием
Сделал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT o.order_id, o.email, o.firstname, o.lastname, os.name AS 
STATUS , o.date_added, o.total, o.currency_code, o.currency_value, op.product_id, COUNT( op.product_id ) AS qua, ch.status, GROUP_CONCAT( 
o.order_id ORDER BY o.order_id ASC 
SEPARATOR  '|' ) AS arr, p.pricenorm
FROM  `order` o
JOIN order_status os ON ( o.order_status_id = os.order_status_id ) 
INNER JOIN order_product op ON ( o.order_id = op.order_id ) 
INNER JOIN product p ON ( op.product_id = p.product_id ) 
LEFT JOIN coupon_history ch ON ( o.order_id = ch.order_id ) 
WHERE o.customer_id =  '4358'
AND o.order_status_id >  '0'
AND os.language_id =  '1'
GROUP BY IF ((p.pricenorm = 0 OR ch.status = 1), o.order_id, p.product_id)
ORDER BY o.date_added DESC 
LIMIT 0 , 1000



Не знаю насколько это верно, но запрос работает именно так как мне нужно!
SQL язык богов!

Всем большое спасибо за внимание и помощь!
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / GROUP BY и GROUP_CONCAT с условием / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]