【问题标题】:Display multiple rows in one column Mysql and PHP一列显示多行Mysql和PHP
【发布时间】:2014-02-14 05:09:07
【问题描述】:

我试图在一列中显示多个行值。我使用 4 个包含一对多关系的表。我已经用我需要的数据建立了一个查询,我不确定问题是在这里还是实际上在 PHP 端。我已经包含了一些代码,所以你可以得到一个想法。老实说,我可能需要使用 GROUP BY 或在 while 之后包含一个 foreach 循环才能获得我想要的结果。如果有人能指出我正确的方向或指导我找到解决方案,我将不胜感激。

我可以使用 GROUP BY category_name 停止类别重复,但我遇到 subCat_name 没有显示所有结果的问题。只显示第一行。它应该显示主 category_name 下的所有 subCat_name

目前正在获取这个

Ideas (category_name)

Shop More( subCat_name)
Have a better wardrobe(subCat_description)

但应该是这样的

Ideas (category_name)

Shop More( subCat_name)
Have a better wardrobe(subCat_description)

Build a Blog( subCat_name)
Share Ideas(subCat_description)

Travel to NYC( subCat_name)
Book a holiday(subCat_description)

MYSQL 查询

$query = 'SELECT project_users.*, project.project_name, category.category_name,     sub_category.subCat_name, sub_category.subCat_description 
FROM project_users 
JOIN project 
ON project.project_id = project_users.project_id 
JOIN category 
ON category.project_id = project.project_id 
JOIN sub_category 
ON sub_category.category_id = category.category_id';

PHP

$result = mysqli_query($link, $query);

if($result) {

    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {

        echo '<!-- category container for tasks-->
              <div class="col-lg-4 category">
               <section class="panel">
                <div class="panel-body">
                 <header class="to-do-head">';
            echo '<h3>' . $row['category_name'] . '</h3>';
            echo ' <a class="to-do pull-right"><i class="icon-plus"></i> Add Task</a>';
            echo '</header>';
            echo '<div class="col-lg-12 task"><!--open task-->';
            echo '<div class="panel-body">';
            echo '<h4>' . $row['subCat_name'] . '</h4>';
            echo '<p>' . $row['subCat_description'] . '</p>';
            echo '</div><!--close panel-body-->';
            echo '<div class="task-foot">';
            echo '<a href=""><i data-original-title="Add Action" class="icon-legal tooltips"></i></a>
                                 <p class="pull-right"><i class="icon-calendar"></i> 16th Jan 2014</p>
                                   </div><!--close task foot-->';
            echo '</div><!--close-lg-12 task-->';
            echo '</div><!--close panel body-->
                  </section><!--close panel-->
                  </div><!--col lg 4 close container for tasks-->'; 

    }//end while

【问题讨论】:

  • 我只输出了一个 subCat_name,应该显示另外三个,似乎它没有正确地迭代那个特定的类别。我不确定我的查询是正确的还是它的 PHP。我会尝试放一个屏幕截图,以便您理解
  • 所以不是所有应该输出的东西都在输出吗?尝试在 mysql 中运行你的 sql(使用 mysql 工作台或命令行),看看这会给你什么。
  • 就个人而言,我会先查看 SQL 语句返回的信息,然后确定我将如何使用它。我一直使用 phpmyadmin 来运行我的查询,以便我知道正在检索哪些数据,然后我使用它来构建我需要构建的内容。
  • 如果您在查询方面需要帮助,请制作一个 sqlfiddle。
  • 我通过查询获得了我想要的结果,但由于某种原因,当我执行 GROUP BY category_name 时,它​​没有重复辅助行信息。这是 sqlfiddle sqlfiddle.com/#!2/faae9/4

标签: php mysql sql


【解决方案1】:

您需要一些基本逻辑来检测类别何时发生变化,并为此输出适当的 html。例如

$old_cat = null;
while($row = mysqli_fetch_array(...)) {
   if ($row['category'] != $old_cat) {
       ... output category header ...
       $old_cat = $row['category'];
   }
   ... output subcategory stuff here ...
}

【讨论】:

    【解决方案2】:

    编辑:为 MySQL 更新

    抱歉,没有说明这是 MySQL。当然 GROUP_CONCAT 将是 LISTAGG 的替代品(而且更容易)。我无法让换行符正常工作(据我所知,'\r\n' 或 CHAR(13,10) 应该换行,但我在 SQLFiddle 中没有任何运气)。

    换行符:http://www.askingbox.com/tip/mysql-line-breaks-in-mysql

    GROUP_CONCAT 分隔符示例:Aggregate function in MySQL - list (like LISTAGG in Oracle)

    这是我想出的:

    SELECT
        category.category_name || CHAR(13, 10)
        || GROUP_CONCAT((sub_category.subCat_name || CHAR(13,10) || subcat_description 
             separator CHAR(13,10)) -- if the separator gives trouble, remove it, use a REPLACE() function around the GROUP_CONCAT, and replace ',' with CHAR(13, 10)
        as list
    
    FROM 
        project_users 
        JOIN project ON project.project_id = project_users.project_id 
        JOIN category ON category.project_id = project.project_id
        JOIN sub_category ON sub_category.category_id = category.category_id
    
    Group By 
        category.category_name
    

    我不确定这是否可行。尝试使用分隔符函数时,我得到的输出是错误,或者在使用任何类型的换行符时,行的输出是“0”。回来报告并让我知道,以便我可以根据需要删除或更改答案。


    (以前的答案,对 ORACLE 有好处)

    为了在单行中显示多行 column_X,以下可能是使用 SQL 时有用的解决方法。使用LISTAGG 和换行符chr(10) 将成为您的朋友。

    表格

    Column Y      Column X
     1             a
     1             b
     1             c
     1             d
     2             foo
     2             bar
    

    代码

    SELECT column_Y, LISTAGG(column_X, chr(10)) WITHIN GROUP (ORDER BY column_X) 
    FROM table
    GROUP BY column_Y
    

    输出

    Column Y      Column X
     1             a
                   b
                   c
                   d
     2             foo
                   bar
    

    如果您喜欢这种方法,这里有一个包含其他示例的网站,可以帮助您入门:

    http://www.techonthenet.com/oracle/functions/listagg.php

    编辑:

    我想我还会提到XMLELEMENTXMLAGG 的使用。它是为 XML 设计的,但也可以与 HTML 一起使用,因为它们都使用标签。我不经常使用它,所以我不能给你一个很好的例子,但是文档(见下面的链接)很好地向你展示了 XMLAGG 的一些力量。您也可以在线查找其他示例:

    http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions215.htm

    【讨论】:

    • 没问题,很高兴为您提供帮助!如果这是您要使用的解决方案,请不要忘记单击复选标记并对答案进行投票。如果任何其他答案有帮助,也请投票(如果/如果可以的话)。
    • 针对 MySQL 进行了更新,如果有帮助请告诉我。
    • Phil 很快就会试试这个,只是在读一下,感谢您的扩展帮助!
    • 我也收到了一个生成的错误。在 '|| 附近使用错误*正确的语法GROUP_CONCAT((sub_category.subCat_name || subcat_description separa' 在第 3 行
    • 嗯,请尝试删除 seperator CHAR(13,10)。它会用逗号分隔项目。将行更改为Replace(Group_Concat(...), ',', CHAR(13,10))。如果char(13,10) 也给您带来麻烦,请使用'\n''\n\r'。您可能必须在编辑器中而不是 SQLFiddle 中执行此操作。或者,也许 MySQL 专家可以为您澄清其中的一些问题。
    【解决方案3】:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多