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
这是我目前的询问,但我希望有这样的东西......
但这就是我得到的:
答案 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可以执行表中的各个行。
就个人而言,我会使用dl
,dt
,dd
标记设置作为我的结构(在评论中暗示,我今天真的很懒,以编码所有的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>";
}
}
}