#mysql #sql #aggregate-functions
#mysql #sql #агрегатные функции
Вопрос:
У меня есть простой select, который возвращает один столбец:
результат: {1,1,2}
Я хочу проверить, все ли результаты равны 1, затем верните true, и если в одном столбце есть 2, верните false.
Пробовал что-то вроде этого:
SELECT IF(items.status=1, 'true', 'false') AS result
FROM bd.items
WHERE items.id=33
Но, очевидно, он возвращает true, если значение равно 1, и false, если оно равно 2, а не только один результат.
Например:
{1,1,1}=true
{1,2,1}=false
{1}=true
{2}=false
Комментарии:
1. если все результаты равны 1, верните true, а если в одном столбце есть 2, верните false. Подумайте в обратном направлении — если хотя бы одна строка имеет значение 2, тогда false, иначе true . Если 1 и 2 являются единственно возможными значениями, тогда достаточно проверить MAX(значение).
Ответ №1:
Это то, что вы хотите?
select min(status = 1) as result
from bd.items
where id = 33
Это возвращает 1
тогда и только тогда, когда все строки имеют status
1
. Если в столбце есть какое-либо другое (не- null
) значение, то возвращается это 0
.
Если вы хотите это для всех элементов сразу:
select id, min(status = 1) as result
from bd.items
group by id
Комментарии:
1. Другие ответы также работают, но пока я буду использовать это, спасибо.
Ответ №2:
Попробуйте следующий запрос:
select
case
when (max(items.status)=min(items.status) and min(items.status)=1)
then 'True' else 'False' end
from items
where items.id=33
group by id
Ответ №3:
Вы можете использовать следующий подход:
select
id, count(status) = count(case when status=1 then 1 end) status
from items
group by id
;
Запрос возвращает true, когда количество всех строк равно количеству строк со статусом = 1
Этот и пара других запросов здесь