Php 显示/逻辑问题,多对多,如何显示?
我在这里遇到了一个真正的问题,我使用php和mysql为一个音乐网站设计了一个数据库:Php 显示/逻辑问题,多对多,如何显示?,php,many-to-many,mysqli,relational-database,Php,Many To Many,Mysqli,Relational Database,我在这里遇到了一个真正的问题,我使用php和mysql为一个音乐网站设计了一个数据库: 艺术家-艺术家id,艺术家姓名 曲目-曲目id,曲目名称 ArtistTracks-track\u id,artistr\u id/
艺术家
-艺术家id
,艺术家姓名
曲目
-曲目id
,曲目名称
ArtistTracks
-track\u id
,artistr\u id
/<
所以我设计了它,一切都很好,但现在如果有一个二重唱(艺术家有相同的轨道)
我真是太蠢了,我以为我会在加入二重唱的时候解决这个问题
因此,现在我添加了一个二重唱,如何显示/选择它
例如,为了获得最新的曲目,我这样做
$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
)
我的问题是,我是否在数据库的设计上犯了错误
如果没有,我应该如何显示它们?我需要在整个阵列上循环并检查轨迹id
是否与另一个轨迹id
匹配吗
提前感谢您的帮助:\
编辑
我让benn花了一整天的时间试图找到一个完美的解决方案,包括删除整个数据库和尝试mongoDB LOL
我设法使曲目显示为应该的singer\u one
和singer\u two
-track\u name
问题是,我的整个网站有6个模板,现在我有12个(因为有两个条件)
我不喜欢这个解决方案,因为现在我需要更新网站的任何变化两次
(因为显示二重唱的条件。)
我的多对多设计错了吗?我应该为二重唱制作另一张桌子吗
提前感谢。首先,你必须确定哪一方具有更高的重要性-可能是艺术家(例如,在另一页中可能是另一方)
您的查询毫无意义:您完全缺少JOIN
构造。让你的艺术家加入他们的歌曲。您可以使用分组,通过使用或不使用分组结果将一个艺术家的所有歌曲连接到一个字段中,并使用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
按曲目编辑分组:
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
普通结果:
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完成的额外处理。当然,如果你想把每首歌都链接到它自己的页面上,最好是最后一首。只需使用一个,它最适合您。我想我知道如何从MySQL中选择,显然我有一些书要读。谢谢你解释得很好的回答。在我看来,这个解释很好。祝你好运很抱歉,测试你的解决方案没有按预期工作。我编辑了我的问题以获取更多信息,我不能放弃,我真的需要一点提示我应该做什么。好吧,首先,你到底想做什么。你想让结果按轨迹分组吗?我用php处理结果集时出错了,我尝试了另一种方法,现在效果很好。谢谢