如何对结果进行分组并显示所有行?

时间:2018-03-03 05:47:04

标签: php mysql sql

SELECT i.itemsname
     , i.itemsprice
     , i.itemsdescrip
     , c.catname
     , c.catdes
     , c.status
     , c.collapse
     , c.catid 
  FROM items i 
  LEFT
  JOIN categories c
    ON c.catid = i.catid 
 WHERE i.restid 
   AND c.restid =12 
GROUP 
    BY c.catid

这是我目前的询问,但我希望有这样的东西......

Example

但这就是我得到的:

This is what I'm getting

2 个答案:

答案 0 :(得分:0)

好的,我在评论中撒谎,所以使用PDO(尚未测试)

$stmt = $PDO->prepare('SELECT
    categories.catname,
    items.itemsname,
    items.itemsprice,
    items.itemsdescrip,
    categories.catdes,
    categories.status,
    categories.collapse,
    categories.catid 
FROM items 
LEFT JOIN categories ON items.catid=categories.catid 
WHERE items.restid AND categories.restid = :restid');

$stmt->execute([':restid' => 12]);

$data = $stmt->fetchAll(\PDO::FETCH_GROUP);



foreach($data as $catname => $rows){
    //echo group html stuff
    //echo "<dl>";
    //echo "<dt>$catname</dt>".;

    foreach($rows as $row){
       //echo row data stuff

      // echo "<dd> {stuff} </dd>";

    }
   //echo "</dl>";
}

我会把html留给你。但正如我所说,你想要一个像这样的数据结构

[
  'BREAKFASTS' => [
       0 => [ name => "wimpy hamburger", description => "bla bla", price => "$100,000"],
       1 => [ ... ]
  ],
  'SINGLE BURGERS' => [ ...]
]
  

请注意,“SELECT”之后的第一个字段默认为FETCH_GROUP

使用的字段

以这种方式看,第一个foreach可以输出类别的标题,例如BREAKFASTS。然后内部foreach可以执行表中的各个行。

就个人而言,我会使用dldtdd标记设置作为我的结构(在评论中暗示,我今天真的很懒,以编码所有的html,{{ 1}})

https://www.w3schools.com/tags/tag_dt.asp

<强>更新

您可能想查看您的查询

<sigh>

似乎有缺陷,只是说。我在优化查询排序时看到了这一点。

    ...
 WHERE
    items.restid AND ...

所以需要注意的一点是,首先你应该将查询基于类别,因为应该显示一个空类别,而没有类别的项目会将它全部转化为比特(基本上,即如何将它们分组)如果他们没有这个类别你最终会得到一些没有类别的大杂烩,当然根据你的例子,我假设一对多关系。例如,一个类别可以包含多个项目,而许多项目可以属于一个类别。 (对于做多对多,这可能更为理想,但那是另一天的另一个故事)

上述查询更优化的原因是内部查询,使用catid仅创建一个小临时表,并且仅对来自cat表的数据进行排序,并仅对由where拉出的数据进行排序。

然后,当我们移动到外部查询时,它们基本上是连接的排序,我们可以从中获取其余数据。在理论上,这通常比这种方式快2到10倍(当然我没有测试这个特定的查询)。当然这是一个更复杂/更高级的查询,并且是可选的,但是如果我的思想在今晚正确的位置它应该提高排序性能... lol

我也缩写你的表名(别名),因为我说我很懒。可悲的是,我的答案总是那么久,不要问我如何看待所有这些问题,这只是经验或我的阅读障碍大脑如何运作?

最后,如果你真的必须使用mysqli,你可以用这样的东西手动分组它们。

   SELECT
    c.catname,
    i.itemsname,
    i.itemsprice,
    i.itemsdescrip,
    c.catdes,
    c.status,
    c.collapse,
    c.catid 
FROM
    (
        SELECT c0.catid FROM categories AS c0 WHERE c0.restid = :restid SORT BY c0.catname
    ) AS t
JOIN
     categories AS c ON t.catid=c.catid 
LEFT JOIN 
    items AS i ON items.catid=categories.catid 
WHERE
     items.restid = ? //< this is the error/omission/strangeness i pointed out above.

对我而言,这一切都是如此平淡(普通,非诗意)。

祝你好运。

答案 1 :(得分:0)

$cat = mysqli_query($connect, "SELECT
categories.catname,
items.itemsname,
items.itemsprice,
items.itemsdescrip,
categories.catdes,
categories.catid 
FROM items 
LEFT JOIN categories ON items.catid=categories.catid 
WHERE items.restid AND categories.restid = 12"); 
if($cat === FALSE) { 
die(mysqli_error()); 
}

$data = []; 
while ($rowb = mysqli_fetch_array($cat)) {
$key = $rowb['catname'];
if(!isset($data[$key]))  $data[$key] = [];
$data[$key][] = $rowb;

foreach($data as $catname => $rowbs){                     
echo " 
<dl><button class='accordiontry'><dt>$catname</dt></button>"; 

<div class='panel1'>

foreach($rowbs as $rowb){
echo"<div class='rmenu'>
<dd><span class='item'>{$rowb['itemsname']}</span>
<span class='price'>£{$rowb['itemsprice']}</span><br>
<span class='des'>{$rowb['itemsdescrip']}</span>  ";
}
echo"</div></dd>
</div></dl>";

}
}
}