Фильтрация rowset

Ярослав

Новичок
Фильтрация rowset

Тестовый пример (очень упрощенный)
Код:
id | status     | extra id  | extra id ...
=================
1     1               11
1     1               18
1     NULL         NULL
2     1               98
2     1               48
2     1               11
2     1               15
3     NULL         45
4     1               54
4     1               65
Нужно сделать фильтрацию по статусам
Припустим фильтруем где статус = 1
Должны получить только айдишники где status = только 1
Код:
id | status     | extra id | extra id...
=================
2     1               98
2     1               48
2     1               11
2     1               15
4     1               54
4     1               65
Группирка и потом каунт не подходит т.к. надо сохранить extra id
Нормальных идей пока нет(
 

Фанат

oncle terrible
Команда форума
не понял.
а почему первые две строчки не прошли через фильтр?
 

Ярослав

Новичок
потому что
там где id = 1 есть статус кот. равно NULL а должен быть везьде 1 для id 1, как это видно в id =2, 4
 

serglt

Анус, ой, Ахтунг
Ярослав
Сам то понял что написал? Тут телепатов нет
 

Ярослав

Новичок
b]x-yuri[/b]
внутренний t1
там идет запрос типа select .. from t1 left join t2
и t1 строки начали дублироватьсяx-yuri

-~{}~ 05.02.09 12:09:

serglt
Извиняюсь если непонятно, но незнаю как понятней обьяснить.
Спрашивайте что не так отвечу.
Главная проблема откинуть все записи где status != 1 в группе id
Блин незнаю как еще понятнее обьяснить, пример уже дал(
 

Фанат

oncle terrible
Команда форума
чего там непонятного?
ему надо, чтобы если в некоторой строке в некотором поле присутствует некоторое значение, то все строки, содержащие некоторое значение в другом поле, совпадающее со значением этом поле в строке с отсуствующим значением в другом поле, выпадали из выборки.

делай группировку, а к ней джойнь нормальную таблиццу
 

serglt

Анус, ой, Ахтунг
A, типа, если хоть раз было значение статуса != 1, для группы с одинаковым id, то их ужо не выводить?
Если да то можно так
SELECT * FROM table WHERE id NOT IN (SELECT DISTINCT(id) FROM table WHERE status != 1)
 

Фанат

oncle terrible
Команда форума
потому что у одной из строк с id=1 пустой статус
вот такая вот реляционная стрюктура
 

Ярослав

Новичок
Автор оригинала: *****
чего там непонятного?
ему надо, чтобы если в некоторой строке в некотором поле присутствует некоторое значение, то все строки, содержащие некоторое значение в другом поле, совпадающее со значением этом поле в строке с отсуствующим значением в другом поле, выпадали из выборки.

делай группировку, а к ней джойнь нормальную таблиццу
Группировку нельзя потому что теряеться тогда extra ids
 

Фанат

oncle terrible
Команда форума
Ярослав, ты тупой?
прочти мое предложение 5 раз. пока не дойдет его смысл.

serglt нафига пихать тупой вложенный селект там, где нужен простой джойн? вы, ламеры, скоро вообще перестанете понимать, что такое реляционная БД.

-~{}~ 05.02.09 13:53:

хотя и так никогда не понимали
 

HraKK

Мудак
Команда форума
*****
Я бы сделал где-то так:
PHP:
SELECT * FROM `join` LEFT JOIN `join` as `j` ON `join`.`id` = `j`.`id` AND `j`.`status` IS NULL WHERE `j`.`id` IS NULL
А вот с групировкой твой вариант, я что-то не понял. Можешь мне объяснить?
 

Ярослав

Новичок
*****
Ни под запрос ни джойн при моей структуре сейчас не поможет((
Потому что статус вычисляеться через
Код:
CASE WHEN `sm`.`status` = 0 THEN '0' WHEN `sm`.`status` = '1' AND `sm`.`coursesinstance_id` != 4 THEN '2' END AS `status`
и в where задать немогу а хевинг срабатывает только потом подзапрос требует только 1 поле id а у меня еще статус.
Запрос получаеться слишком сложным. Надо менять структуру
 

Фанат

oncle terrible
Команда форума
ну, я думал сгруппировать по id, но, похоже, действительно не получится.
 

serglt

Анус, ой, Ахтунг
*****
> вы, ламеры, скоро вообще перестанете понимать, что такое реляционная БД
А вот обзываться не стоит, тем более не зная о знаниях человека.
Реляционная БД и скорость выполнения вложенных запросов никак не взаимосвязаны. Она зависит от особенностей БД.
 
Сверху