[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: GROUP BY + ORDER BY по условию, да/нет
Страницы: 1, 2, 3
GET
Привет, как думаете можно ли как-то сделать:

Запрос:
SELECT `tab`.`id`, COUNT(*) AS `count` 
FROM `tab`,`tab2`
WHERE `tab2`.`id2` IN ('6','7')
AND `tab2`.`id3`='5'
AND `tab2`.`id4`=`tab`.`id` GROUP BY `tab2`.`id4`
ORDER BY `count` DESC


Т.е. мы поискали строки в `tab2` у которых `id2`=6 и/или `id2`=7
затем сгруппировали по `id4`:
В результате получили таблицу строк у которых
либо
`count`=1 - т.е. нашлось или 6 или 7.
либо
`count`=2 - т.е. нашлось и 6 и 7.

Затем сортирую, так, чтоб те у кого совпадений больше `count`=2 - были на самом верху.

Но, иногда, может так быть, что `count`=2 не будет, не будет 2-х совпадений, когда, например `tab2`.`id2`=7 вообще не найдено, то
нет смысла делать ни GROUP BY `tab2`.`id4` ни ORDER BY `count`, можно ли в этом запросе как-то определить такую логику? Т.е. делать группировку + сортировку только если было >1 совпадений для `tab2`.`id2`.

Спасибо.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
непонятно, но на первый взгляд напрашивается UNION

_____________
Стимулятор ~yoomoney - 41001303250491
GET
Valick
Цитата
непонятно, но на первый взгляд напрашивается UNION


Дак вот...если б было условие 6 или 7, то можно было бы 2 запроса сдлелать черз UNION, а тут 6 и/или 7

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
так?
SELECT t1.`id` FROM `tab` t1
RIGHT JOIN
(SELECT `id4` id , COUNT(*) count
FROM `tab2`
WHERE id2 IN (6,7) AND `id3` = 5
GROUP BY `id4`
ORDER BY count DESC) t2
USING (`id`)


_____________
Стимулятор ~yoomoney - 41001303250491
GET
Valick

Спасибо, но...
все равно идет и группировка и сортировка, а хотелось:
Цитата
Т.е. делать группировку + сортировку только если было >1 совпадений для `tab2`.`id2`.

я именно этого хотел избежать, пробывал даже примерно с таким куском:

CASE
WHEN
`id2`='6' THEN 1
WHEN `id2`='7' THEN 2
END
AS
'N'


но, это избыточно получается лишний столбец, который мало, что дает

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
Цитата
Т.е. делать группировку + сортировку только если было >1

COUNT это агрегатная функция, и она вычисляет результат работы GROUP BY, понимаешь на что я намекаю? В данном случае до GROUP BY, COUNT просто неизвестен. А если убрать GROUP BY, то у COUNT будет совсем иная сущность.

_____________
Стимулятор ~yoomoney - 41001303250491
GET
Valick

я понял, я подмал, что в момент, когда он вычисляет путь сортировки...
Цитата
WHERE `tab2`.`id2` IN ('6','7')

он смог бы здесь как бы запомнить выбор...
1. было ли 6
2. было ли 7
А потом уже на основании это делать или нет GROUP BY потому, как если 6 не было или 7 не было смысла его делать нет. Ну ты прав, наверное не туда полез, в какие то мною придуманные дебри.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
значения 6 и 7 это разные строки одного слолбца, группировка проходит вообще по другому столбцу

_____________
Стимулятор ~yoomoney - 41001303250491
GET
Цитата
группировка проходит вообще по другому столбцу

Да понял я...говорю же я думал:
1. находит подходящие строки
2. Групирует

А момент выполнения 1 может запомнить по каким параметрам нашел, прежде чем ко "второй" части запроса перейти.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
T1grOK
Читал читал и так не понял правильно ли понял задачу или нет :D

(SELECT `tab`.`id`, COUNT(*) AS `count` 
FROM `tab`,`tab2`
WHERE `tab2`.`id2` IN ('6','7')
AND `tab2`.`id3`='5'
AND `tab2`.`id4`=`tab`.`id` GROUP BY `tab2`.`id4` HAVING `count` > 1
ORDER BY `count` DESC)
UNION ALL
(SELECT `tab`.`id`, COUNT(*) AS `count`
FROM `tab`,`tab2`
WHERE `tab2`.`id2` IN ('6','7')
AND `tab2`.`id3`='5'
AND `tab2`.`id4`=`tab`.`id` GROUP BY `tab2`.`id4` HAVING `count` = 1)

Вот только непонятно к чему это все обычный запрос с GROUP BY даст то же самое.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
GET
Цитата
Вот только непонятно к чему это все обычный запрос с GROUP BY даст то же самое.

T1grOK

Спасибо.

Маленько не то. Я не хотел делать GROUP BY (для `count`=1) потому, как это достаточно тяжелая операция для десятков тысяч строк, а для варианта "только `count`=1", она не нужна и делать ее не нужно, ну бесполезная в моем случае.

Думал,
Цитата
SELECT `tab`.`id`
FROM `tab`,`tab2`
WHERE `tab2`.`id2` IN ('6','7') 
AND `tab2`.`id3`='5'
AND `tab2`.`id4`=`tab`.`id`


здесь mysql уже как бы знает были ли задействованы только
`tab2`.`id2`=6 //GROUP BY не нужен
или
`tab2`.`id2`=7 //GROUP BY не нужен
или
`tab2`.`id2`=6 и `tab2`.`id2`=7//GROUP BY нужен

Короче, ладно парни спасибо, что помогаете. Это я какую-то ерунду помоему написал, запрос он же целостный, как я его разорву подумаю, что делать а потом дальше пойду.

Спасибо.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
ABC, в ПХП можно сделать всё, кроме детей smile.gif

Вот только что за условие "`tab2`.`id2`=6 и `tab2`.`id2`=7", как одна и та же величина может быть равна разным значениям? У тебя изначально, похоже, предполагается эта ошибочная логика.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
GET
Цитата
У тебя изначально, похоже, предполагается эта ошибочная логика.


1 1 красный 6
2 2 белый 7
3 3 зеленый 3
4 4 красный 6
5 4 белый 7

красный и белый (флаг) `tab2`.`id2` IN ('6','7')

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
Цитата
как одна и та же величина может быть равна разным

все там норм с логикой, запрос выбирает разные строки, а в роли AND выступает GROUP BY, бз него как раз никакого AND и не получится

_____________
Стимулятор ~yoomoney - 41001303250491
GET
Цитата
все там норм с логикой, запрос выбирает разные строки, а в роли AND выступает GROUP BY, бз него как раз никакого AND и не получится

+!

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.