Типовая задачка, а я что от туплю.

Bitterman

Новичок
[sql]
SELECT * , COUNT( a.id ) AS res
FROM question AS q
LEFT OUTER JOIN answers AS a ON ( a.question_id = q.id ) AND (a.user_id =1)
GROUP BY q.id
HAVING res =0
[/sql]
 

Kelkos

Сам себе программер
Bitterman
а! ну конечно я не понял тебя сразу..

работает. пасиб..
 

Santiago

Новичок
Имхо, можно даже немного упростить:

Код:
SELECT * 
FROM question AS q
LEFT OUTER JOIN answers AS a ON ( a.question_id = q.id ) AND (
a.user_id = 1
)
WHERE a.user_id IS NULL
GROUP BY q.id
 

alpine

Новичок
С подзапросом кажется так правильно будет: :)
[sql]
SELECT * FROM questions WHERE id NOT IN (SELECT question_id FROM answers WHERE user_id=?)
[/sql]
 

Kelkos

Сам себе программер
спасибо, спасибо..
можно ещё и "OUTER" убрать.. я понимаю..
 

chira

Новичок
Kelkos
"OUTER" - может помочь только тебе, в смысле писать меньше
GROUP BY - убрав его, можешь избавиться от лишней сортировки на сервере.
 

Bitterman

Новичок
Да, согласен, запрос может быть гораздо проще. Просто изначально писал выборку вопросов, на которые никто не отвечал, а потом стал менять отталкиваясь от уже написанного, хотя надо было бы писать заново. Так что правильно будет
[sql]
SELECT *
FROM question AS q
LEFT OUTER JOIN answers AS a ON ( a.question_id = q.id ) AND (
a.user_id = 1
)
WHERE a.user_id IS NULL
[/sql]
 

bakh

Абалдуй
Bitterman: А я вот третий раз спрошу: а скажи-таки, а почему религия запрещает без join'ов написать not exists?..
 

alpine

Новичок
bakh
Думаю есть как минимум две причины :
- версия mysql < 4.1.x
- хз че это такое и как оно работает :)
 

Bitterman

Новичок
bakh
Собсно, alpine уже ответил. Насколько я понимаю, NOT EXISTS подразумевает использование вложенного запроса, а моя версия MySQL этого не позволяет.
 

bakh

Абалдуй
Bitterman: Понятно...
...а ещё я бы убрал из запроса AS... Для сокращения и для однообразия... А AS применять только при приведении типов... ;)
Ы?.. %)
...
И насчёт алиасов в HAVING...
Я таки считаю, что там написано примерно следующее (перевод с русского технического на русский литературный ;) ):
Писать надо так - HAVING MAX(row)... А в более старых вресиях MySQL можно было писать и так HAVING max_row_alias, что не есть правильно, т.к. не соотвествует стандарту SQL...
Не могу проверить это на практике, т.к. под рукой нету ни одной разновидности MySQL, а качать их и ставить лишь для проверки... Мягко говоря, лень... ;)
 

Bitterman

Новичок
bakh
...а ещё я бы убрал из запроса AS... Для сокращения и для однообразия...
Мне так легче читать запрос, да и конструкция
table1 AS t
выглядит ИМХО логичнее и понятнее, чем
table1 t
Что касается сокращения и однообразия, то сокращение невелико, а запросы у меня как раз все однообразны, с AS :)

Я таки считаю, что там написано примерно следующее...
Прочитать это можно как угодно, но ИМХО замена выражения алиасом как раз является ярким примером разумного сокращения. Что касается стандарта SQL - не могу ничего сказать по этому поводу, мне главное, чтобы запрос не тормозился, а про сколь-нибудь значительное влияние на это использования алиасов я не слышал.
 

bakh

Абалдуй
Bitterman: Ну, [не]использование AS в случае алиасов таблиц/полей - это вопрос "религии"... ;) Т.е. это даже не может являться предметом какого-либо спора... :)
Прочитать это можно как угодно, но ИМХО замена выражения алиасом как раз является ярким примером разумного сокращения.
Да... Но стандарт есть стандарт!.. И потому лучше писать так, как он предписывает... Чтобы потом, когда/если перелезешь на более другой сервер, проблем меньше было... ;)
 
Сверху