Как искать при объединении 3 таблиц, но исключить результат для одной из них? - PullRequest
1 голос
/ 27 августа 2011

Я часами связывался, чтобы получить конкретный результат, и не нашел никакого ответа в Интернете - и, поскольку я не эксперт по SQL в all , я спрашиваю вопрос здесь.

У меня есть 3 таблицы: user (id, name ...), cars (id, type, color, engine power ...) и посредник таблица для сохранения всех результатов, которые пользователи дали машине: scores (id, user_id, car_id, score).

Я пытаюсь найти запрос, который мог бы вернуть для одного конкретного пользователя, всех автомобилей, которые он еще не оценил . Я пробовал следующее, но он возвращает ноль:

$q=mysql_query("SELECT * FROM cars LEFT OUTER JOIN scores ON cars.id = scores.car_id WHERE scores.user_id != ('".$userId."')");

У кого-нибудь есть подсказка?

Ответы [ 3 ]

2 голосов
/ 27 августа 2011

Вы можете использовать свой код с небольшими изменениями:

SELECT * FROM cars 
LEFT OUTER JOIN scores ON cars.id = scores.car_id and scores.user_id=".$userId."
WHERE scores.id IS NULL
2 голосов
/ 27 августа 2011
SELECT
  *
FROM
  cars
WHERE
  NOT EXISTS (SELECT 1 FROM scores WHERE car_id = cars.id AND user_id = ?)

где ? - идентификатор этого конкретного пользователя.

Здесь полезен составной индекс в scores сверх (car_id, user_id).

1 голос
/ 27 августа 2011
SELECT * FROM
car c
WHERE c.id NOT IN (
    SELECT s.car_id
    FROM score s, user u
    WHERE u.id = s.user_id
        AND u.id = ?
)
...