MySQL много вопросов для многих вопрос - PullRequest
2 голосов
/ 20 сентября 2011

У меня есть база данных много ко многим, и есть запрос, с которым я только что застрял и не могу это сделать.

У меня есть 4 таблицы Художники , Треки, Альбомы , Клипы

Теперь я на странице исполнителя, поэтому мне нужно получить их на странице исполнителя, я уже получил все из них, но не так, как я хочу.

, потому что некоторые треки, альбомы, клипы также принадлежат другим артистам (дуэт), и мне нужно отобразить их имя.

но проблема в том, чтоя выбираю с использованием идентификатора исполнителя, поэтому моя функция GROUPC_CONCAT не будет работать. Это запрос, который получает альбомы исполнителя.

   SELECT  al.album_name, GROUP_CONCAT(a.artist_name SEPARATOR ', ') AS 'artist_name'

   FROM 
     Albums al
   LEFT JOIN 
     ArtistAlbums art ON art.album_id = al.album_id
   LEFT JOIN 
     Artists a on a.artist_id = art.artist_id
   WHERE 
     a.artist_id = 10
   GROUP BY 
     al.album_id

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

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

обратите внимание, что я новичок в mysql, и я не нашел никаких ответов по этой конкретной проблеме, почти нетресурсы на многие ко многим запросам.

как я могу решить эту проблему .?

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

1 Ответ

3 голосов
/ 20 сентября 2011

Представьте, что псевдонимы таблиц действительно псевдонимы строк .То есть для целей выражений в предложении WHERE и списке выбора псевдоним ссылается на одну строку за раз.

Поскольку вы создали такое условие, что a.artist_id = 10, то только строки для этого исполнителя соответствуют условию.Что вы действительно хотите - это сопоставить всех исполнителей в альбоме, учитывая, что один из исполнителей - artist_id = 10.

Для этого вам нужно еще одно объединение, чтобы строка, где artist_id = 10 соответствовала all строк для соответствующего альбома.

SELECT  al.album_name, GROUP_CONCAT(a2.artist_name SEPARATOR ', ') AS `artist_name`
FROM 
  Albums al
INNER JOIN 
  ArtistAlbums art ON art.album_id = al.album_id
INNER JOIN 
  Artists a on a.artist_id = art.artist_id
INNER JOIN 
  ArtistAlbums art2 ON art2.album_id = al.album_id
INNER JOIN 
  Artists a2 on a2.artist_id = art2.artist_id
WHERE 
  a.artist_id = 10
GROUP BY 
  al.album_id

PS: Я также заменил использование LEFT JOIN на INNER JOIN.Нет причин, по которым вам нужно LEFT JOIN, поскольку вы явно ищете альбомы с подходящим исполнителем, а не все альбомы, независимо от того, есть ли у него исполнитель 10. Просмотрите значение различных типов объединения.


Ваш следующий вопрос:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...