首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将每篇文章的多个标签检索到一个引导表列中

问将每篇文章的多个标签检索到一个引导表列中
EN

Stack Overflow用户
提问于 2022-01-18 16:33:14
回答 1查看 68关注 0票数 0

我有一个可排序的引导表(我对此相当自豪),它可以填充我文章db表中的表。

目前,我的文章表有5个表示标记的额外列,每个列都是单独填充的。

foreach完全按照要求工作(下面是用于排序的JS,但排除在这里)。

代码语言:javascript
复制
    <div class="MTable">
    <?php
    include 'conn.php';
    $result = $conn->query("SELECT * FROM table_a WHERE Column_1 ='Value' OR Column_2 ='Value'");
    $table_a = $result->fetch_all(MYSQLI_ASSOC);
    ?>

   <table id="table_1" class="table display table-sortable table-hover table-dark">
    <thead>
        <tr>
            <th onclick="sortTable(0)">Column 1</th>
            <th onclick="sortTable(1)">Column 2</th>
            <th onclick="sortTable(2)">Column 3</th>
            <th onclick="sortTable(3)">Column 4</th>
            <th onclick="sortTable(4)">Column 5</th>
            <th onclick="sortTable(5)">Column 6</th>
            <th onclick="sortTable(6)">Column 7</th>
        </tr>
        </thead>
       
  <tbody>      
     <?php foreach($table_a as $return) : ?>
        <tr>
            <td><?= $return['Column_1']; ?></td>
            <td><?= $return['Column_2']; ?></td>
            <td><?= $return['Tag_1']; ?></td>
            <td><?= $return['Tag_2']; ?></td>
            <td><?= $return['Tag_3']; ?></td>
            <td><?= $return['Tag_4']; ?></td>
            <td><?= $return['Tag_5']; ?></td>
       </tr>
    <?php endforeach; ?>
   </tbody>
   </table>

我已经开始构建一个标记系统,并计划删除这些额外的5列的文章表。

做了一些研究,并回顾了以前关于堆栈溢出的问题,并建立了一个三表系统("toxi“解决方案)。

我的表格布局如下所示,斜体代表外键;

  • Table_a (文章) article_id,更多列
  • Table_b (标签) tag_id,tag_name
  • Table_c (Articles_Tags) id,article_id,tag_id

目标:

我希望将第3-7列合并为一个列,并返回由;分隔的所有tag_names。就像这样..。

原样和准BS表设计

我可以使用内部连接来组合我的三个表(如下所示),但我不知道如何处理多个查询并管理foreach。有点超出了我的深度。

代码语言:javascript
复制
SELECT tag_name
      FROM table_a
          INNER JOIN table_c
                  ON table_c.article_id = table_a.article_id 
          INNER JOIN table_b
                  ON table_c.tag_id = table_b.tag_id
       WHERE table_c.article_id = 'SelectedArticleName'
EN

回答 1

Stack Overflow用户

发布于 2022-01-18 20:46:59

这与塞纳特函数的MySQL (查看您的MySQL版本和相关文档)是可能的。它使您能够在一个请求中获取所有数据。应该是这样的:

代码语言:javascript
复制
SELECT article_id, article_name,
       GROUP_CONCAT(DISTINCT tag_name, 
                  ORDER BY tag_name DESC SEPARATOR ';') AS tags
  FROM table_a
      INNER JOIN table_c
              ON table_c.article_id = table_a.article_id 
      INNER JOIN table_b
              ON table_c.tag_id = table_b.tag_id 
      GROUP BY table_a.article_id, table_a.article_name

注意,GROUP_CONCAT结果的长度是有限的。

结果被截断到group_concat_max_len系统变量给出的最大长度,该变量的默认值为1024。虽然返回值的有效最大长度受max_allowed_packet值的约束,但可以将其设置为更高的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70759111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档