显示/逻辑问题,多对多,如何显示?

时间:2011-09-05 19:05:29

标签: php many-to-many mysqli relational-database

我在这里遇到了一个真正的问题,我正在使用php和mysql我为音乐网站设计了一个数据库。:

artists - artist_idartist_name;

tracks - track_idtrack_name;

ArtistTracks - track_idartist_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 ??

提前感谢您的帮助:\

修改

我一整天都试着找到一个完美的解决方案,包括删除整个数据库并尝试mongoDB LOL,

我设法让曲目显示为singer_onesinger_two - track_name

问题是我的整个网站有6个模板,现在我有12个(因为有两个条件)...

我不喜欢这个解决方案,因为现在我需要更新网站中的任何更改两次 (因为显示二重唱的条件。)

是我的多对多错误的设计我应该为二重唱制作另一张桌子吗?

提前感谢。

1 个答案:

答案 0 :(得分:1)

首先,您必须确定具有更高重要性的一方 - 可能是艺术家(例如,可能在另一页中以其他方式回合)。

您的查询毫无意义:您完全错过了JOIN构造。获取您的艺术家并加入他们的歌曲。您可以使用分组并使用GROUP_CONCAT将一个艺术家的所有歌曲连接到一个字段中,或者不将结果分组并使用php处理该集合(对于每个轨道,它返回一个包含艺术家姓名和曲目名称的行)。 / p>

按艺术家分组:

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

EDIT按轨道分组:

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为最后一个解决方案所需的额外处理。当然,如果您想将每个曲目链接到自己的页面,那么最后一个曲目会更好。只需使用一个最适合你的。