将多行显示为数组

时间:2015-04-29 13:46:28

标签: php mysql

我希望能够在一列中显示一个包含人员列表的表,在另一列中显示一系列订单。

People
========
person_id
fname
lname

Orders
========
order_id
person_id
product_id

Products
=========
product_id
productname

我有以下代码:

SELECT people.fname, people.lname, products.productname
FROM people
INNER JOIN orders ON people.person_id = orders.person_id
INNER JOIN products ON products.product_id = orders.product_id
ORDER BY lname
...
$rows = $result->num_rows;
while($row = $result->fetch_assoc()) {
    echo "<tr><td>Edit</td>
    <td>".$row["lname"].", ".$row['fname']."</td>
    <td>".$row['productname']."</td></tr>";
    }

显示:
    史密斯,鲍勃|第1项     史密斯,鲍勃|第2项     史密斯,鲍勃|第3项     罗伯茨,吉尔|第2项     等等。

我想要的是显示:
    史密斯,鲍勃|项目1,项目2,项目3
    罗伯茨,吉尔|第2项

如何仅显示一次名称(基于person_id),然后在另一列中显示其订单列表?

2 个答案:

答案 0 :(得分:1)

在MySQL中,您必须使用GROUP_CONCAT功能。例如:

SELECT CONCAT(LNAME,", ",FNAME), GROUP_CONCAT(PRODUCTNAME)
FROM PEOPLE P, PRODUCTS PR, ORDERS O
WHERE P.PERSON_ID = O.PERSON_ID
AND O.PRODUCT_ID = PR.PRODUCT_ID
GROUP BY (LNAME, FNAME);

答案 1 :(得分:1)

面向Php的解决方案:

您可以使用此人的姓名作为关键字将您的商品名称存​​储在数组中:

$rows = $result->num_rows;

$data = array();
while($row = $result->fetch_assoc())
{
     $name = $row["lname"].", ".$row['fname'];
     $data[$name][] = $row['productname'];
}

然后,您只需循环遍历此数组:

foreach($data as $name => $products)
{
     echo "<tr><td>Edit</td><td>".$name."</td>";
     foreach($products as $productname)
     {
         echo "<td>".$productname."</td>";
     }
     echo "<tr>";
}
相关问题