链接不同表中的行

时间:2017-03-19 22:49:51

标签: php mysql

我一直在尝试寻找这个问题的解决方案,但我不确定如何制定问题,而我找到的答案并不是我正在寻找的。

我的数据库中有2个表:

艺术家

name -  artistid(a_i)
Abba - 1

的SongList

songid - songid2(a_i) - songtext - songname - artistname
1        -    1  -  This is the song text - mamma mia - abba
1   - 2 - This is the song text - song2 - abba
  • Songid =与artistid相同(这就像一张专辑)
  • songid2 =来自这位特定艺术家的不同歌曲。

当我选择一位艺术家时,我可以从不同歌曲的列表中进行选择。问题是我想获得" songid2"的歌曲/歌曲名称。

这就是它的外观

  • 选择艺术家> getArtistSongs.php?artistid = 1
  • 选择歌曲> show.php?songid2 = 1

现在在这种情况下,文本将显示,因为songid2 = artistid 但如果我选择歌曲:songid2=2,显然什么都不会出现。现在我的问题是,如何在php中正确查询?

EDIt:感谢OIbisidian,我设法获得了歌曲文本的正确数据,但现在我很难回应艺术家的歌曲..我不确定我做错了什么但是数据库中的所有歌曲都显示出来,并且它们不可点击,因为" songid2"不会分配给他们。

$result = mysqli_query($con,"SELECT songname, songid2 * From bridge b, songs s, artists a WHERE s.songid2 = a.artistid");
    while($row = mysqli_fetch_array($result)) {
        echo "</br>";
        echo "<div id='artistlista'>";
        echo "<ul><li><a href='show.php?songid2=" . $row['songid2'] . "'>" . $row['songname'] .  "</a></li></ul>";
        echo "</div>";
    }

1 个答案:

答案 0 :(得分:0)

  

songid2 =来自这位特定艺术家的不同歌曲。

根本没有PHP的问题;问题听起来与您在表中存储数据的方式有关。你不应该有一个与一个变量相关的多个值!听起来你会分别从两张桌子中分别存储歌曲和艺术家,再加上 bridging table

桥接表(也称为关联实体)允许您有两个外键作为另一个表中的主键,解决了多对多关系的问题。

更合乎逻辑的方法是类似于以下的表:

表1 - 歌曲

   ID   | Song Name
-------------------
   1    | Hello
   2    | Goodbye

表2 - 艺术家

   ID    | Arist Name
---------------------
   1     | ABBA
   2     | ABC

Bridging Table(将歌曲与艺术家联系起来):

   ID    | Song ID   | Artist ID
--------------------------------
   1     | 2         | 1
   2     | 1         | 2
   3     | 2         | 2

在上面的示例中,ABBAABC都有一首名为Goodbye的歌曲,但只有ABBA有一首名为Hello的歌曲。

这样,当您想要查询特定艺术家时,您可以选择歌曲名称相关的艺术家名称,例如:

SELECT s.name, a.name
FROM songs s, bridge b, artists a
WHERE b.sid = s.id AND b.aid = a.id

希望这有帮助! :)