[英]Display multiple rows in one column Mysql and PHP
我試圖在一列中顯示多個行值。 我正在使用由一對多關系組成的4個表。 我已經用所需的數據構建了一個查詢,我不確定問題是在這里還是實際上在PHP方面。 我已包含一些代碼,因此您可以了解一下。 老實說,我可能需要在一段時間后使用GROUP BY或包含一個foreach循環才能獲得所需的結果。 如果有人可以指出正確的方向或指導我解決問題,將不勝感激。
我可以使用GROUP BY category_name停止類別重復,但是Im的subCat_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
您需要一些基本的邏輯來檢測類別何時更改,並為此輸出適當的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 ...
}
嘗試使用Mysql GROUP_CONCAT函數
http://dev.mysql.com/doc/refman/5.0/zh/group-by-functions.html#function_group-concat
編輯:為MySQL更新
抱歉,沒有注意到這是MySQL。 當然,GROUP_CONCAT是LISTAGG的替代品(而且更容易)。 我在使換行符起作用時遇到了麻煩(據我所知,'\\ r \\ n'或CHAR(13,10)應該給出換行符,但是SQLFiddle中沒有運氣)。
換行符: http : //www.askingbox.com/tip/mysql-line-breaks-in-mysql
GROUP_CONCAT分隔符示例: MySQL中的聚合函數-列表(如Oracle中的LISTAGG)
這是我想出的:
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
編輯:
我以為我還會提到XMLELEMENT
和XMLAGG
的使用。 它是為XML設計的,但也可以與HTML一起使用,因為它們都使用標簽。 我不經常使用它,所以我不能給您一個很好的例子,但是文檔(請參閱以下鏈接)很好地向您展示了XMLAGG的強大功能。 您也可以在線查找其他示例:
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions215.htm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.