сложный запрос

antonim

Новичок
сложный запрос

Добрый день .. пытаюсь сделать сложный запрос вот такой:

SELECT count(*)
FROM competition_log l
LEFT JOIN competition_user u ON u.id = l.competition_user_id
LEFT JOIN competition_answer a ON l.competition_answer_id = a.id
LEFT JOIN competition_questions q ON a.competition_questions_id = q.id
LEFT JOIN competition_data d ON q.competition_data_id = d.id
WHERE d.id = 175 AND q.answer_good_id<>a.id
ORDER BY `l`.`id` ASC

логика такова:
d.id - это id конкурса
q.answer_good_id - правельный ответ
a.id - ответ, который даль юзер

теперь мне нужно если хотябы один ответ дан неправильно : q.answer_good_id<>a.id
то не показывать все записи у которых u.id = текущему u.id (т.е. не показывать юзера, который ошибся)

помогите плз
 

prolis

Новичок
.

-~{}~ 25.06.09 12:54:

Задача стоит: отобразить всех участвовавших в опросе, у которых нет неправильных ответов?
 

Gas

может по одной?
я бы для начала сделал так: вложенным запросом (derived-query) вытягиваем пользователей у которых только правильные ответы и к этой выборке джойним таблицы для получения всех нужных данных.
 

prolis

Новичок
antonim
ты мне мозг взорвал: таблица anfer ссылается на question по полю question_id, а questions ссылается на ansfer по полю answer_good_id
как ты записи в questions умудряешься вставлять, ведь в тот момент ещё нет подчиненной ansfer?
 

antonim

Новичок
самое шлавное не мог понять как сделать "минус" из выбранного, но вот написал и вроди нормально работает:

select U.* from competition_user U
where not exists
(select 1
from competition_log L,
competition_answer A,
competition_questions Q,
competition_user U1
where L.competition_answer_id = A.id
and A.competition_questions_id = Q.id
and U1.id = L.competition_user_id
and U1.competition_data_id = $id_competition
and L.competition_user_id = U.id
and Q.answer_good_id<>L.competition_answer_id )
AND U.competition_data_id = $id_competition
 

prolis

Новичок
Q.answer_good_id<>L.competition_answer_id
- зачем тебе непраильные ответы?
 

antonim

Новичок
я не вывожу пользователей у которых есть хоть один неправильный ответ
 

Gas

может по одной?
antonim
я бы ещё попробовал как-то так, но конечно, нужно тестировать на реальных данных что лучше.

Код:
SELECT U.*, COUNT(Q.answer_good_id<>L.competition_answer_id) AS cnt_err
FROM  
      сompetition_user U
      competition_log L,
      competition_answer A,
      competition_questions Q
WHERE 
      U.competition_data_id = $id_competition
      AND L.competition_user_id = U.id 
      AND L.competition_answer_id = A.id
      AND A.competition_questions_id = Q.id      
GROUP BY U.id
HAVING cnt_err = 0
 
Сверху