Дисплей / Логическая проблема, многие ко многим, как отобразить? - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть реальная проблема здесь, я использую php и mysql. Я разработал базу данных для музыкального веб-сайта.

artists - artist_id, artist_name;

tracks - track_id, track_name;

ArtistTracks - track_id, artist_id // < no more than one row for any combination.;

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

Я так глуп, что просто подумал, что решу это, когда добавлю дуэт.

так что теперь я добавил дуэт, как его отобразить / выбрать .?

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

        $sql = 'SELECT Tracks.track_id, Tracks.track_name, Artists.artist_name 

                   FROM ArtistTracks, Tracks, Artists

                WHERE ArtistTracks.track_id = Tracks.track_id
                AND ArtistTracks.artist_id = Artists.artist_id

                  ORDER BY tracks.track_id DESC LIMIT 10';

достаточно справедливый результат:

Array
(
 [0] => Array
    (
        [track_id] => 33
        [track_name] => track duet.
        [artist_name] => artist b
    )    

[1] => Array
    (
        [track_id] => 33
        [track_name] => track duet.
        [artist_name] => artist b
    )

У меня вопрос, не ошибся ли я с дизайном базы данных ????

и если нет, то как я должен их отображать, нужно ли мне перебрать весь массив и проверить, соответствует ли track_id другому track_id ??

заранее спасибо за любую помощь: \

EDIT

Я буквально целый день пытался найти идеальное решение, включая удаление всей базы данных и попытки использования Long-файлов mongoDB,

Мне удалось сделать так, чтобы треки выглядели как singer_one и singer_two - track_name

проблема в том, что у меня было 6 шаблонов для всего моего сайта, а теперь у меня 12 (потому что есть два условия) ..

Мне не нравится это решение, потому что теперь мне нужно дважды обновить любое изменение на сайте. (из-за условий отображения дуэтов.)

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

Заранее спасибо.

1 Ответ

1 голос
/ 05 сентября 2011

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

Ваш запрос не имеет большого смысла: вы полностью упускаете конструкцию JOIN. Найдите своих артистов и присоединяйтесь к их песням. Вы можете использовать группирование и объединить все песни для одного исполнителя в одно поле, используя GROUP_CONCAT , или не группировать результаты и обрабатывать набор с помощью php (для каждого трека возвращается строка с именем исполнителя и названием трека) .

Группировка по исполнителю:

SELECT a.artist_name, GROUP_CONCAT(a.track_name SEPARATOR '; ') AS 'tracks' FROM artists a
    LEFT JOIN ArtistsTracks at ON at.artist_id = a.artist_id
    LEFT JOIN Tracks t ON at.track_id = t.track_id
    GROUP BY a.artist_id

РЕДАКТИРОВАТЬ Группировка по дорожке:

SELECT a.track_name, GROUP_CONCAT(a.artist_name SEPARATOR '; ') AS 'artists' FROM artists a
    LEFT JOIN ArtistsTracks at ON at.artist_id = a.artist_id
    LEFT JOIN Tracks t ON at.track_id = t.track_id
    GROUP BY a.track_id

Простой результат:

SELECT a.artist_name, a.track_name FROM artists a
    LEFT JOIN ArtistsTracks at ON at.artist_id = a.artist_id
    LEFT JOIN Tracks t ON at.track_id = t.track_id

Хотя первые два решения, как правило, работают медленнее по сравнению с последним для больших наборов данных, вы должны учесть дополнительную обработку, необходимую php для последнего решения. Конечно, если, например, вы хотите связать каждый трек с отдельной страницей, вам лучше использовать последний. Просто используйте тот, который подходит вам больше всего.

...