为了尽可能少地保留SQL语句,我想从MySQL中选择set:
SELECT * FROM products WHERE category IN (10,120,150,500) ORDER BY category,id;
现在,我有以下方式列出产品:
CATEGORY
- product 1
- product 2
CATEGORY 2
- product 37
...
处理MySQL结果的最佳和最有效的方法是什么?
我觉得像(伪PHP)
foreach ($product = fetch__assoc($result)){
$products[$category][] = $product;
}
然后在输出时,执行foreach循环:
foreach($categories as $category){
foreach($products[$category] as $product){
$output;
}
}
这是最好的,还是像mysql_use_groupby
或其他东西一样神奇的东西?
答案 0 :(得分:4)
与mluebke
注释一样,使用GROUP意味着您只能为每个类别获得一个结果。根据你给出的列表,我想你想要这样的东西:
$sql = "SELECT * FROM products WHERE category IN (10,120,150,500) GROUP BY category ORDER BY category, id";
$res = mysql_query($sql);
$list = array();
while ($r = mysql_fetch_object($res)) {
$list[$r->category][$r->id]['name'] = $r->name;
$list[$r->category][$r->id]['whatever'] = $r->whatever;
// etc
}
然后遍历数组。例如:
foreach ($list as $category => $products) {
echo '<h1>' . $category . '</h1>';
foreach ($products as $productId => $productInfo) {
echo 'Product ' . $productId . ': ' . $productInfo['name'];
// etc
}
}
答案 1 :(得分:2)
不,我认为您的解决方案最适合此问题。似乎对你来说重要的是后来的输出,所以你应该坚持你的方法。
答案 2 :(得分:0)
您想获得类别列表还是实际将所有产品分组?
如果是后者,最好这样做:
SELECT
p.product_id,
p.name,
p.category_id,
c.name AS category
FROM products p
JOIN categories c ON (c.category_id = p.category_id AND p.category_id IN (x,y,z))
然后在PHP中你可以浏览数组(伪代码):
$cats = array();
foreach($products as $product) {
if(!in_array($product['category'], $cats)) {
$cats[$product['category_id']] = $product['category'];
}
$cats[$product['category_id']][$product['product_id']] = $product['name'];
}
将使用$ cats作为数组,并将产品分类到其中。