Задать вопрос
BupycNet
@BupycNet
Основатель PushAll

Как исключить все строки с одинаковым значением поля, если одна из них не подходит?

К примеру есть таблица
id | objid | status
1 | 1 | 1
2 | 1 | 0
3 | 1 | 0
4 | 1 | 1
5 | 2 | 0
6 | 2 | 0
7 | 2 | 0
8 | 2 | 0
9 | 3 | 1
10 | 3 | 1

В данном случае мне нужно только objid = 2 т.к. у всех значений status=0. При этом objid 1 и 3 не подходят, т.к. у 3 status=1 а у 1 статус у некоторых равен 1, а у некоторых 0.

Да по идее можно взять те, что равны 1 и исключить эти ID из выборки. Но давайте представим, что таких с 1 около 100 тысяч записей, и в подзапросе их исключать будет накладно.
Возможно ли сказать mysql, что не нужны все objid где status не равен 0? Ну или же, если перефразировать - исключить все objid, если у них есть хотя бы одно значение равно 1?

Даже вот предположим, что мы получили список тех, где есть хотя бы один ноль - как убрать из этого списка все записи с одинаковыми objid где есть хотя бы одна единица?

PS. Статусов может быть не 2 а больше. Например 5 статусов. Нужно получить те objid где есть статус 0 и 4 но нет статусов 1 2 и 3.
  • Вопрос задан
  • 716 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
Stalker_RED
@Stalker_RED
Корявенько, но работает
sqlfiddle.com/#!9/cb6ea/1

Еще вариант
sqlfiddle.com/#!9/cb6ea/2

Или даже так:
sqlfiddle.com/#!9/cb6ea/3

По хорошему, надо посмотреть explain, подумать и/или потестировать на данных, но я оставлю это вам.
Ответ написан
svd71
@svd71
Select * from mytable t1
Where not exists (select * from mytable t2
Where t2.objid=t1.objid and t2.status=1)
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `objid`
    FROM `table`
    GROUP BY `objid`
    HAVING MAX(`status`) = 0

SELECT DISTINCT `t1`.`objid`
    FROM `table` AS `t1`
    LEFT JOIN (
        SELECT DISTINCT `objid`
            FROM `table`
            WHERE `status` = 1
    ) AS `t2` USING(`objid`)
    WHERE `t2`.`objid` IS NULL
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы