在一个项目上做一个allnighter,我的脑子里一片空白......真的很简单:
我有两个MySQL表,产品和类别。每个产品只属于一个类别。每个类别都有几种产品。
SELECT
p.uid as product_uid, p.name_NL as product_name, p.price as product_price,
c.uid as category_uid, c.name_NL as category_name
FROM
product p, category c
WHERE
p.category_uid = c.uid
这让我对各自类别中的所有产品有了很好的了解。我的问题是关于在页面上输出此数据。我的目标是:
<h1>Category name</h1>
<p>Product in this category</p>
<p>Other product in this category</p>
<h1>Next category</h1>
<p>Product in next category</p>
我的思绪现在完全是空白。怎么会这样做?
我想避免做子查询(如果可能的话)。
亲切的问候,
中号
答案 0 :(得分:4)
如何添加ORDER BY category_uid
以便在SQL查询中按类别对产品进行排序。然后使用PHP循环遍历每个产品(行),当遇到新类别时,添加一个新标题。
示例:强>
<?php
// ...
$previous_category_uid = null;
// Loop through each row.
while ( $row = $result->fetch_assoc() )
{
// If the category UID is not the same as the one from the previous row, add a header.
if ( $previous_category_uid != $row['category_uid'] )
{
echo '<h1>' . $row['category_name'] . '</h1>';
$previous_category_uid = $row['category_uid'];
}
}
此方法的好处是您不必嵌套查询。单个查询就足够了。
答案 1 :(得分:0)
您是否只需要使用GROUP BY category_uid
?
答案 2 :(得分:0)
假设您正在寻找每个类别中的类别名称和产品的字母顺序:
SELECT
p.uid as product_uid, p.name_NL as product_name, p.price as product_price,
c.uid as category_uid, c.name_NL as category_name
FROM product p INNER JOIN category c ON p.category_uid = c.uid
ORDER BY category_name, product_name
这也会将您的查询的笛卡尔积和WHERE
转换为内连接。
要使用所需的标题输出,只需循环返回的行,并跟踪您所在的类别。只要当前行的类别与前一行不同,就会打印一个新的{{1对于新类别并更新存储的“当前”类别。
答案 3 :(得分:0)
一般来说,您有两种选择:
选项2可能更直接,但显然有更多查询。最后,这是你的电话。