我希望能够在一列中显示一个包含人员列表的表,在另一列中显示一系列订单。
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),然后在另一列中显示其订单列表?
答案 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>";
}