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

Kelkos

Сам себе программер
Типовая задачка, а я что от туплю.

Прекрасно понимаю, что задачка типовая, а вот что то не получается. Ужжж и мануальчик почитал.. и гуглю спросил.. И чудный метод научного тыка использовал.. ан не выходит каменный цветок.

Структура базы вопросов questions:
id
name

Структура ответов answers
question_id
user_id

на один вопрос могут отвечать несколько пользователей или не быть ответов вообще.

Нужно выбрать все вопросы из базы на которые не отвечал пользователь user_id

Спасибо.
 

alpine

Новичок
Kelkos
SELECT * FROM questions WHERE id IN(SELECT question_id FROM answers WHERE user_id<>?)
 

Bitterman

Новичок
Не проверял, но как-то так:
[sql]
SELECT ..., COUNT(a.id) as res FROM questions as q
LEFT OUTER JOIN answers as a ON a.question_id=q.id
GROUP BY q.id
HAVING res = 0
[/sql]
 

alpine

Новичок
Bitterman
Выведутся вопросы, на которые вообще никто никогда не отвечал )
 

Bitterman

Новичок
А, сорри, невнимательно прочитал.
Тогда надо добавить условие a.user_id='ID юзера' либо в условие ON, либо в условие WHERE
 

Kelkos

Сам себе программер
alpine
нет, не то..
Bitterman
что то ничего не получилось. и так и так пробывал.
 

bakh

Абалдуй
...а разве в MySQL не имеется конструкции [NOT] EXIST?..
 

Bitterman

Новичок
А конкретнее? Ошибку или пустой рекордсет? У тебя точно есть вопросы, которые удовлетворяют условию?
Покажи запрос.
 

Kelkos

Сам себе программер
Автор оригинала: Bitterman
А конкретнее? Ошибку или пустой рекордсет? У тебя точно есть вопросы, которые удовлетворяют условию?
Покажи запрос.
PHP:
 SELECT 
 `questions`.id AS q_id, 
 `questions`.name AS q_name,
 `answers`.id AS a_id,
 COUNT(`answers`.id) AS res,
 `answers`.user_id 
 FROM `questions` 
 LEFT OUTER  JOIN `answers` ON `answers`.questions_id=`questions`.id
 WHERE `answers`.user_id=2
 GROUP BY `questions`.id
 HAVING res = 0
 ORDER BY `questions`.id
(user_id=2 - по этому пользователю выбираю для примера).
возвращает пустой рекордсет.
 

bakh

Абалдуй
Kelkos
[SQL]COUNT(`answers`.id) AS res,
...
HAVING res = 0[/SQL]
...а с каких пор в HAVING можно указывать алиасы полей?..
 

Bitterman

Новичок
bakh
Псевдоним используется в качестве имени столбца в данном выражении и может применяться в ORDER BY или HAVING.

http://www.mysql.ru/docs/man/SELECT.html

Kelkos
хм, так на первый взгляд все верно. Ты уверен, что есть вопросы, на которые не отвечал юзер 2? Если да, то ближе к вечеру попробую еще раз посмотреть.
 

bakh

Абалдуй
Bitterman: Гут... У нас на FB нельзя... ;)
Кстати, в мануале написано, что возможность такой записи зависит от версии Мускуля... %)
...
И всё равно, а [NOT] EXISTS имеется у MySQL?..
 

Kelkos

Сам себе программер
Bitterman
да уверен.
вот данные на которых тестирую:

questions:
id name
1;"вопрос 1"
2;"вопрос 2"
3;"вопрос 3"
4;"вопрос 4"

answers
id questions_id user_id
1;1;1
2;1;2
3;1;3
4;3;1
5;3;4
6;3;2
7;4;2
8;2;3
9;4;1

как видим, выборка по пользователю 2 должна возвратить вопрос номер 2, т.к. он на него не отвечал.
 

Bitterman

Новичок
Kelkos
Ошибку уже увидел, нельзя условие по юзеру задавать в WHERE. Сейчас не могу сообразить, прокатит ли, если засунуть это в условие ON, вроде должно. Попробуй.
bakh
Кстати, в мануале написано, что возможность такой записи зависит от версии Мускуля
Честно говоря, не нашел такого в мануале.
 

Kelkos

Сам себе программер
Bitterman
помоему не прокатило.... блин. фигня какая то. элементарная задачка и столько мороки.
 

bakh

Абалдуй
Bitterman Ну что ж ты так, не читаешь сам то, на что ссылаешься?.. ;)
В версии MySQL 3.22.5 или более поздней можно также писать запросы, как показано ниже:
mysql> SELECT user,MAX(salary) FROM users
GROUP BY user HAVING MAX(salary)>10;

В более старых версиях MySQL вместо этого можно указывать:
mysql> SELECT user,MAX(salary) AS sum FROM users
GROUP BY user HAVING sum>10;
 

Bitterman

Новичок
bakh
Я читал это. Где тут сказано, что в более ранних версиях в HAVING нельзя указывать алиасы? Здесь речь идет об аггрегатных функциях.
Kelkos
Сделал пример у себя, все вроде работает. Может ты условие не так добавил?
 

Kelkos

Сам себе программер
Bitterman
покажи свой пример. может я не до конца твою мысль просёк.
 
Сверху