Как задать запрос к MYSQL, с учетом нескольких полей в разных таблицах?

Добрый вечер, друзья, помогите кто может, сижу туплю уже часа 2.
Кратко о задание, имеются 3 MySQL таблицы ( книги, жанры, и связка ид книги - ид жанра ) , у одной книги может быть несколько жанров, топишь и создаются 2, 3 или 4 поля в таблице с привязкой.
А теперь, и сам вопрос. Как правильно составить запрос выборки из таблиц книг, у которых ид жанра = 25 НО исключить книги, у которых есть ид жанра 22.
Естественно, мой пример ниже не правильный =(
p.s. Использую IN т.к. может быть по много параметров

books - таблица книг
books_genre_tie - таблица привязки жанров к книге
SELECT b.* FROM books b, books_genre_tie bgt
WHERE  b.book_id = bgt.book_id AND bgt.book_genre_id IN (25) AND bgt.book_genre_id NOT IN (22) 
ORDER BY b.book_id LIMIT 1, 35


За ранее всем спасибо
  • Вопрос задан
  • 372 просмотра
Решения вопроса 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
1. Лучше явно прописывайте {JOIN_TYPE} JOIN
2. Не используйте сокращения типа "b" Никогда. В один прекрасный момент попадете на запрос с join таблицы самой себя и полей эдак на 20 штук, помянете мое слово))
3. Лучше не пишите select *, пишите явно, что хотите получить.

SELECT books.id,
    books.name AS book_name,
    GROUP_CONCAT(genres.name) AS genres
FROM books_has_genres
    INNER JOIN books ON books_has_genres.book_id = books.id
    INNER JOIN genres ON books_has_genres.genre_id = genres.id
WHERE books_has_genres.genre_id = 25
      AND books_has_genres.book_id NOT IN (
          SELECT sub_books_has_genres.book_id
              FROM books_has_genres AS sub_books_has_genres
              WHERE sub_books_has_genres.genre_id = 22
      )
GROUP BY books_has_genres.book_id
ORDER BY books.id
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы