2015-08-18 3 views
2

У меня есть заявление:Как исключить записи по категориям

$statement_q = " 
SELECT img 
    , title 
    , time 
    , videos.id 
    , date 
    FROM videos 
    JOIN videocategories 
    ON videos.id = videocategories.video_id 
    JOIN categories 
    ON categories.id = videocategories.category_id 
WHERE categories.name != 'Western' 
GROUP 
    BY videos.id 
ORDER 
    BY videos.id 
LIMIT {$startpoint} , {$per_page}"; 

Иерархия:

enter image description here

Если фильм имеет более чем одну категорию она покажет!

Фильм 1: один западный, Приключение (это покажет)

Movie 2: Западный (одна категории, поэтому он не будет показывать)

Как исключить западные фильмы?

+1

Я думаю, что нам нужно больше информации о вашей таблицы метаданных –

+0

Но здесь есть все. Я просто не знаю, как это изменить ... – Enteee

+0

НЕТ, можно догадаться. Пользователь вводит два ключевых слова? И в чем разница между категориями видео и категориями? –

ответ

0

Нечто подобное должно работать. Я не могу создать таблицы прямо сейчас, чтобы проверить это.

$statement_q = "SELECT img,title,time,videos.id as id,date FROM videos 
INNER JOIN videocategories ON videos.id = videocategories.video_id 
INNER JOIN categories on categories.id = videocategories.category_id 
WHERE categories.name != 'Western' 
AND not exists (select v.id from videocategories v where v.video_id = videos.id 
       and v.category_id <> videocategories.category_id) 
GROUP by videos.id 
ORDER BY videos.id 
LIMIT {$startpoint} , {$per_page}"; 
+0

i get error: Неизвестный столбец 'v.id' в 'списке полей' – Enteee

+0

Вы не должны, вы положили v в после видеокатегорий? Это псевдонимы этого экземпляра таблицы, чтобы двигатель мог различать эти два. Если вы это сделаете, и это все еще не удастся, я в скором времени перепишу все это и буду первым. –

+0

Да, я сделал. «select v.id from videocategories». В видеокатегориях нет идентификатора поля, только его единственная иерархия (video_id, category_id) – Enteee

0
DROP TABLE IF EXISTS video_category; 

CREATE TABLE video_category 
(video_id INT NOT NULL 
,category_id INT NOT NULL 
,PRIMARY KEY(video_id,category_id) 
); 

INSERT INTO video_category VALUES 
(101,1),(101,2),(102,1),(102,3); 

SELECT * FROM video_category; 
+----------+-------------+ 
| video_id | category_id | 
+----------+-------------+ 
|  101 |   1 | 
|  101 |   2 | 
|  102 |   1 | 
|  102 |   3 | 
+----------+-------------+ 

SELECT * 
    FROM video_category x 
    LEFT 
    JOIN video_category y 
    ON y.video_id = x.video_id 
    AND y.category_id = 2; 
+----------+-------------+----------+-------------+ 
| video_id | category_id | video_id | category_id | 
+----------+-------------+----------+-------------+ 
|  101 |   1 |  101 |   2 | 
|  101 |   2 |  101 |   2 | 
|  102 |   1 |  NULL |  NULL | 
|  102 |   3 |  NULL |  NULL | 
+----------+-------------+----------+-------------+ 

SELECT DISTINCT x.video_id 
      FROM video_category x 
      LEFT 
      JOIN video_category y 
      ON y.video_id = x.video_id 
      AND y.category_id = 2 
      WHERE y.category_id IS NULL; 
+----------+ 
| video_id | 
+----------+ 
|  102 | 
+----------+ 
Смежные вопросы