Условие неравенства

spiner

Новичок
Условие неравенства

Привет. Есть mysql 5.0
Есть две таблицы:
tbl1: id | name
tbl2: id | id_code

Таблица tbl1 относится к tbl2 через поле id как 1 к бесконечности.
Вопрос. Как вывести все name, id_code которых не равно xxx?
Спасибо.
 

Beavis

Banned
JOIN

-~{}~ 18.04.08 00:04:

и живой пример почему не надо называть ключи просто "id"
нифига не понятно вообще о чем речь идет, и какие ключи связаны между собой
 

spiner

Новичок
между собой связаны ключи id. Как они связаны я написал.
Где в этом примере показано, почему не надо называть ключи просто "id"?

-~{}~ 18.04.08 00:26:

что join?
select tbl1.name from tbl1 join tbl2 on (tbl1.id=tbl2.id) and tbl2.id_code<>'xxx'? Так не работает.
 

spiner

Новичок
Запрос работает, только ответ не тот.
Если бы связь была 1:1, то это бы работало, а у меня 1 к беск.
Смотрите:
data tbl1:
id, name
100, бумага
200, карандаш
300, ножницы

data tbl2:
id, id_code
100, 1111
100, 1112
100, 1113
100, 1114
100, 1115
200, 1111
200, 1114
300, 1119

Допустим, мне надо выбрать все нименования (name), где id_code<>1114. По идее, нужно получить только "ножницы".
Если делать запрос, который я делал, и выбирать не одно поле name, а все поля, то будет следующее:
100, бумага, 1111
100, бумага, 1112
100, бумага, 1113
100, бумага, 1115
200, карандаш, 1111
300, ножницы, 1119

Этот ответ неправильный..
 

Gas

может по одной?
zuzmic
inner join тоже подойдёт

spiner
ну сразу бы так и сказал
join + group by ... having sum(1114=tbl2.id_code) = 0
 

spiner

Новичок
Mr_Max
я просил все name, id_code которых чему-то не равно. или я не так сформулировал? как надо сформулировать?

Gas
спасибо.
 

spiner

Новичок
К сожалению, запрос group by having 'условие' в моем случае тоже работает неправильно.
Допустим есть запрос (он аналогичен join)
select * from tbl1, tbl2 where (tbl1.id=tbl2.id) group by tbl1.id having tbl2.id_code!=1114

group by группирует результы по id, но в результате этого запроса в поле id_code попадает первое по порядку записи значение, а оно очень часто не равно 1114. А having просто перед отсылкой клиенту, убирает те записи, где id_code в результате равен 1114.
Поясню на примере:
Запроса без having:
select * from tbl1, tbl2 where (tbl1.id=tbl2.id) group by tbl1.id
Результат:
id, name, id, id_code
100, бумага, 100, 1111
200, карандаш, 200, 1111
300, ножницы, 300, 1119

Как вы понимаете, если применить having с условием id_code!=1114, то результат останется тем же, хотя теоретически должен быть только id=300.
Так что having нельзя применять.
Что подскажете?

-~{}~ 19.04.08 15:53:

решил использовать in select
 

Beavis

Banned
Автор оригинала: spiner
К сожалению, запрос group by having 'условие' в моем случае тоже работает неправильно.
ты даже после того как тебе всё разжевали сам запрос написать не можешь? это не запрос не работает, а кое-что другое...
[SQL]
SELECT tbl1.id, tbl1.name, tbl2.id_code FROM `tbl1` LEFT JOIN `tbl2` ON tbl1.id = tbl2.id GROUP BY tbl1.id HAVING SUM(1114 = tbl2.id_code) = 0
[/SQL]
 

spiner

Новичок
Согласен, по своей глупости переписал запрос неверно. Извиняюсь.
Подскажите, пожалуйста, куда посмотреть отличие
SUM( 1114 = tbl2.id_code ) = 0 от tbl2.id_code<>1114 в контексте having.
 

Gas

может по одной?
логика примерно такая: чтоб проверить твоё условие, нам всё равно нужно обработать для каждой записи из tbl1 все соответствующие записи из tbl2 (для этого делается группировка, where использовать нельзя) и вернуть те tbl1, среди которых ни разу в tbl2 не встречается запись tbl2.id_code=1114. В твоём вариант tbl2.id_code - неизвестна какая может быть из-за group by и нужно использовать агретную ф-цию.
 
Сверху