2016-06-26 3 views
0

Итак, я создаю базу данных музыки. Я использую три таблицы (файлы, категории, категории_агрегирования).Внутреннее соединение SQL и несколько строк

Я хочу, чтобы иметь возможность выбрать файл, который находится в нескольких категориях (например, песню, которая как поп и рок)

Я уже сделал or дисперсию (приведена ниже для справки)

SELECT DISTINCT `files`.`filename` FROM `files` 
INNER JOIN `categories_assignments` 
ON `files`.`id` = `categories_assignments`.`fileid` 
INNER JOIN `categories` 
ON `categories_assignments`.`catid` = `categories`.`id` 
WHERE `categories`.`name` = 'rock' OR `categories`.`name`='pop'; 
+0

и вопрос есть? ... – scaisEdge

ответ

1

Это проблема «наборы установленной внутри-» - вы ищете песни которые имеют набор категорий. Я хотел бы решить эту проблему с помощью group by и having:

SELECT f.filename 
FROM files f JOIN 
    categories_assignments ca 
    ON f.id = ca.fileid JOIN 
    categories c 
    ON ca.catid = c.id 
WHERE c.name IN ('rock', 'pop') 
GROUP BY f.filename 
HAVING COUNT(*) = 2; 

Примечания:

  • Таблицы псевдонимов сделать запрос легче писать и читать.
  • Я не вижу необходимости устанавливать обратные сигналы вокруг каждого идентификатора. Это просто делает запрос труднее читать.
  • Вы должны использовать IN вместо нескольких сравнений OR.
  • Если вы изучаете SQL, то SELECT DISTINCT почти никогда не бывает полезным. Сначала научитесь использовать GROUP BY.
0

Group файл и принимать только те группы, имеющие оба категорий

SELECT f.filename 
FROM files f 
INNER JOIN categories_assignments ca ON f.id = ca.fileid 
INNER JOIN categories c ON ca.catid` = c.id 
WHERE c.name in ('rock', 'pop') 
GROUP BY f.filename 
HAVING count(c.name) = 2 
Смежные вопросы