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

  • Автор темы Автор темы spiner
  • Дата начала Дата начала

spiner

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

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

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

-~{}~ 18.04.08 00:04:

и живой пример почему не надо называть ключи просто "id"
нифига не понятно вообще о чем речь идет, и какие ключи связаны между собой
 
между собой связаны ключи 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'? Так не работает.
 
Запрос работает, только ответ не тот.
Если бы связь была 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

Этот ответ неправильный..
 
zuzmic
inner join тоже подойдёт

spiner
ну сразу бы так и сказал
join + group by ... having sum(1114=tbl2.id_code) = 0
 
Mr_Max
я просил все name, id_code которых чему-то не равно. или я не так сформулировал? как надо сформулировать?

Gas
спасибо.
 
К сожалению, запрос 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
 
Автор оригинала: 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]
 
Согласен, по своей глупости переписал запрос неверно. Извиняюсь.
Подскажите, пожалуйста, куда посмотреть отличие
SUM( 1114 = tbl2.id_code ) = 0 от tbl2.id_code<>1114 в контексте having.
 
логика примерно такая: чтоб проверить твоё условие, нам всё равно нужно обработать для каждой записи из tbl1 все соответствующие записи из tbl2 (для этого делается группировка, where использовать нельзя) и вернуть те tbl1, среди которых ни разу в tbl2 не встречается запись tbl2.id_code=1114. В твоём вариант tbl2.id_code - неизвестна какая может быть из-за group by и нужно использовать агретную ф-цию.
 
Сверху