(решено)MYSQL сверка результата COUNT на стороне БД

Модератор: Модераторы

Ответить
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

(решено)MYSQL сверка результата COUNT на стороне БД

Сообщение vitaly_l »

Всем привет.
Дана MYSQL и в ней есть примерно такой запрос:

Код: Выделить всё

SELECT COUNT(`some_id`) as test FROM `ostalnoe_pofig` ;

Соответственно, всё что я получаю это некое число записанное в test.

И мне нужно сравнить этот результат что-то типа: WHERE test > 5

Код: Выделить всё

SELECT COUNT(`some_id`) as test FROM `ostalnoe_pofig` WHERE test > 5;

WHERE test > 5, естественно не работает.

Я что-то подобное когда-то делал и обращался к переименованным AS переменным, но не помню как и где. :cry:
:roll: Пожалуйста не бейте сапогами, но подскажите, как оно правильно, у MySQL - вышеизложенное спросить?

Спасибо.
Последний раз редактировалось vitaly_l 06.11.2017 19:23:59, всего редактировалось 4 раза.
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: MYSQL сверка результата COUNT на стороне БД

Сообщение kosteek »

Уточните что нужно сравнить и что получить.

Код: Выделить всё

SELECT IF(COUNT(`some_id`) > 5,'Больше пяти', 'Пять или меньше') FROM `ostalnoe_pofig`;
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Re: MYSQL сверка результата COUNT на стороне БД

Сообщение vitaly_l »

kosteek писал(а):Уточните что нужно сравнить и что получить.

Вы в принципе почти правильно поняли задачу.

Код: Выделить всё

IF(COUNT(`some_id`) > 5)

Но это не работает, возможно потому что у меня, там, более сложный запрос.

Мне нужно сравнить значение лежащее в переменной TEST переименованной силами AS.
Сам результат TEST мне не нужен. У меня с использованием Вашего примера получилось:

Код: Выделить всё

SELECT `some_id`, IF(COUNT(`some_id`)>5 ) FROM `tab` WHERE `some_id` IN (1,2,3,4,5) GROUP BY `some_id`; 
//где `some_id` не уникальный индекс и их много одинаковых.

И она вернула неправильный результат.

Как к созданной силами AS переменной TEST обратиться в MySQL?
или как на стороне MySQL проверить что COUNT > 5 ?
и если результат больше 5 то она должна мне вернуть `some_id` а если нет, то вернуть пустоту.


должно получиться что-то примерно "такое":

Код: Выделить всё

SELECT `some_id`, COUNT(`some_id`) as test FROM `tab` WHERE ( IF (test > 5)=true ) AND `some_id` IN (1,2,3,4,5) GROUP BY `some_id`; 

точнее из вышеприведённого примера можно понять что требуется сделать...


/
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: MYSQL сверка результата COUNT на стороне БД

Сообщение kosteek »

А если так

Код: Выделить всё

SELECT IF (COUNT(`some_id`) > 5,`some_id`,NULL) as test  FROM `tab` WHERE test is NOT NULL AND `some_id` IN (1,2,3,4,5) GROUP BY `some_id`;


если нужно вывести кол-во `some_id` то можно так

Код: Выделить всё

SELECT IF (COUNT(`some_id`) > 5,`some_id`,NULL) as test, COUNT(`some_id`) as count_test  FROM `tab` WHERE test is NOT NULL AND `some_id` IN (1,2,3,4,5) GROUP BY `some_id`;
Последний раз редактировалось kosteek 06.11.2017 17:47:26, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Re: MYSQL сверка результата COUNT на стороне БД

Сообщение vitaly_l »

kosteek писал(а):А если так

Если так..., то у меня честно говоря - башню снесло... Но, если это сработает... <== то, это будет УЯ!
Сейчас попробую, отпишусь.
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: MYSQL сверка результата COUNT на стороне БД

Сообщение kosteek »

Объясню что происходит в скрипте:

Код: Выделить всё

IF (COUNT(`some_id`) > 5,`some_id`,NULL)

Сравнение делается в секции SELECT. Сравниваем COUNT(`some_id`) > 5, если ИСТИНА то выводим `some_id`, если лож, то NULL.

Код: Выделить всё

WHERE test is NOT NULL

Условие отбора - указываем не отображать пустые (NULL), которые в секции SELECT при сравнении дают ЛОЖ.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Re: MYSQL сверка результата COUNT на стороне БД

Сообщение vitaly_l »

Код: Выделить всё

Ответ MySQL: Документация

#1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса
около '> 5,`some_id`,NULL) as test FROM `tab` WHERE test is NOT NULL AND ... на строке 1


Добавлено спустя 5 минут 55 секунд:
Наверное такое возможно в каких-то других БД, а не в MySQL :cry: .

Добавлено спустя 3 минуты 33 секунды:
При этом первая часть запроса правильная, и MySQL не ругается, а вот на вторую часть: test is NOT NULL <== ругается
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: MYSQL сверка результата COUNT на стороне БД

Сообщение kosteek »

Да, есть такое, вот так работает, проверил

Код: Выделить всё

SELECT IF (COUNT(`some_id`) > 5,`some_id`,NULL) as test, COUNT(`some_id`) as count_test  FROM `tab` WHERE `some_id` IN (1,2,3,4,5) GROUP BY `some_id`;


Добавлено спустя 14 минут 58 секунд:
Мда, работать будет так

Код: Выделить всё

SELECT * from (SELECT IF (COUNT(`some_id`) > 5,`some_id`,NULL) as test, COUNT(`some_id`) as count_test  FROM `tab` WHERE `some_id` IN (1,2,3,4,5) GROUP BY `some_id`) t WHERE t.test is not null;
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Re: (решено)MYSQL сверка результата COUNT на стороне БД

Сообщение vitaly_l »

kosteek писал(а):Да, есть такое, вот так работает, проверил

Что-то не то тесты не проходят.

Добавлено спустя 22 минуты 2 секунд:
Re: MYSQL сверка результата COUNT на стороне БД
kosteek писал(а):SELECT * from (SELECT IF (COUNT(`some_id`) > 5,`some_id`,NULL) as test, COUNT(`some_id`) as count_test  FROM `tab` WHERE `some_id` IN (1,2,3,4,5) GROUP BY `some_id`) t WHERE t.test is not null;

Вот этот вариант тесты проходит, СПАСИБО БОЛЬШОЕ!

Но здесь второй SELECT, а мне кажется, что я делал как-то без второго SELECT и как-то напрямую обращался ещё в первом SELECT. И кстати оператор IF при использовании второго SELECT => лишний, потому что, при втором SELECT можно ей говорить WHERE t.test > 5; без использования IF.
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: MYSQL сверка результата COUNT на стороне БД

Сообщение kosteek »

Я не знаю по какой причине, но MySQL, в секции WHERE, не оперирует с алиасами, объявленными в секции SELECT.
Подсмотрел как делают в инете и увидел примеры со вторым SELECT.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Re: (решено)MYSQL сверка результата COUNT на стороне БД

Сообщение olegy123 »

vitaly_l писал(а):WHERE test > 5, естественно не работает.

Это филтр по полю test, когда test будет больше 5, кол-во Row суммируются.
vitaly_l писал(а):Соответственно, всё что я получаю это некое число записанное в test.

получите кол-во полученных записей.

Добавлено спустя 51 секунду:
kosteek писал(а):IF (COUNT(`some_id`) > 5,`some_id`,NULL)

Зачем нулить? Бррр.

Добавлено спустя 3 минуты 25 секунд:
vitaly_l писал(а):SELECT IF (COUNT(`some_id`) > 5,`some_id`,NULL) as test, COUNT(`some_id`) as count_test FROM `tab` WHERE `some_id` IN (1,2,3,4,5) GROUP BY `some_id`

если значения `some_id` IN (1,2,3,4,5) -тогда выводим.
но COUNT - это подсчет Row(количество записей в таблице)..
IF (COUNT(`some_id`) > 5,`some_id`,NULL) as test, COUNT(`some_id`) - это что хотели сказать? типа

Код: Выделить всё

NULL,1
NULL,2
..
NULL,5
6,6
?

Добавлено спустя 5 минут 25 секунд:
Может проще:
SELECT t1.test FROM (SELECT COUNT(`some_id`) as test FROM `ostalnoe_pofig`) as t1 where t1.test>5;
Тогда либо NULL либо >5
Но проще еще
SELECT IF (COUNT(`some_id`) > 5,`some_id`,NULL) as test FROM `ostalnoe_pofig`
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Re: (решено)MYSQL сверка результата COUNT на стороне БД

Сообщение vitaly_l »

нашёл правильное решение для одного SELECT => HAVING !

Код: Выделить всё

HAVING test > 5


( если ВДРУГ кому ещё эта HAVING хрень понадобится )
Ответить