在一列Mysql和PHP中显示多行

时间:2014-01-23 15:01:32

标签: php mysql sql

我试图在一列中显示多个行值。我使用4个表,其中包含一对多的关系。我已经使用我需要的数据构建了一个查询,我不确定问题是在这里是lyly还是实际上在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

$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

3 个答案:

答案 0 :(得分:2)

您需要一些基本逻辑来检测类别何时更改,并为此输出适当的html。 e.g。

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

答案 1 :(得分:1)

答案 2 :(得分:0)

编辑:已更新为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