我试图在一列中显示多个行值。我使用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
答案 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)
尝试使用Mysql GROUP_CONCAT函数
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
答案 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
编辑:
我想我也会提到使用XMLELEMENT
和XMLAGG
。它是为XML设计的,但也可以与HTML一起使用,因为它们都使用标签。我不经常使用它,所以我不能给你一个很好的例子,但文档(参见下面的链接)很好地向你展示了XMLAGG的一些功能。您还可以在线查找其他示例:
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions215.htm