【问题标题】:PHP MySQL Treat GROUP_CONCAT results as separate itemsPHP MySQL 将 GROUP_CONCAT 结果视为单独的项目
【发布时间】:2015-03-25 00:00:48
【问题描述】:

我正在使用 PHP 和 MySQL 制作音乐分类数据库。 我有三张桌子:

歌曲:

ID  | Title
------------------------
1   | Example Song

类型:

ID  | Name
------------------------
1   | Classical
2   | Instrumental

歌曲类型

SongID | GenreID
----------------
1      | 1
1      | 2

我的查询是:

SELECT s.title, GROUP_CONCAT(DISTINCT g.name SEPARATOR ', ')
FROM song s    
LEFT JOIN songgenre sg ON s.id=sg.s_id
LEFT JOIN genre g ON sg.genreid = g.id

我正在使用 GROUP_CONCAT 来支持多种类型,如图所示:

标题:“示例歌曲”流派:古典、器乐

我希望在 PHP 中为每个流派生成一个链接,这样如果用户点击“古典”,他们就会看到更多列为古典的歌曲。问题是,我不确定如何为每种类型提供自己的链接。 GROUP_CONCAT 的问题是两种类型在同一行中一起返回,我不确定如何拆分行以添加指向每个单独类型的链接。

【问题讨论】:

  • 该链接将触发一个新查询,该查询将根据流派进行选择 - 我认为这就是您要问的
  • @Dagon 我知道如何实际创建查询,我的问题是如何将每种类型视为它自己的链接。我希望将每种流派作为其自己的单独链接,我不知道该怎么做。我将更新问题以使其更清楚。
  • <a href="search.php?genre=1">Classical</a>
  • @Dagon 我的问题是 MySQL 返回 "Classical, Instrumental" 作为一行,我不知道如何实际将它们分开以添加 属性。
  • explode() 在逗号上,然后循环

标签: php mysql pdo group-concat


【解决方案1】:

OP 要求的一个非常基本的示例

$var="Classical, Instrumental";

$each=explode(', ',$var);

foreach($each as $v){
echo '<a href="search.php?genre='.$v.'">'.$v.'</a>';
}

【讨论】:

  • 我将在这里简单说明一下,并指出如果流派名称包含逗号,这种方法将失败。确实,这种方法是优秀文章Signs that you're a bad programmer中列出的“弹球编程”的第三个标志。
  • 我接受我的坏事。
【解决方案2】:

不要在数据库层内分组——将未分组(但已排序)的记录集返回给 PHP 并从那里处理:

$qry = $pdo->query('
  SELECT   sg.SongID, sg.GenreID, s.Title, g.Name
  FROM     song s
             LEFT JOIN songgenre sg ON s.ID = sg.SongID
             LEFT JOIN genre g ON sg.GenreID = g.ID
  ORDER BY sg.SongID, sg.GenreID
');

if ($qry) {
  echo '<ul class="songs">';

  $row = $qry->fetch();
  while ($row) {
    $current_song = $row['SongID'];

    echo '<li>'
       ,   '<span class="title">', htmlentities($row['Title']), '</span>'
       ,   '<ul class="genres">';
    do {
      echo   '<li>'
         ,     '<a href="genre.php?id=', intval($row['GenreID']), '">'
         ,       htmlentities($row['Name'])
         ,     '</a>'
         ,   '</li>';
    } while ($row = $qry->fetch() and $row['SongID'] == $current_song);

    echo   '</ul>'
       , '</li>';
  }

  echo '</ul>';
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2012-07-04
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多