0

我需要根据中间和子 id 两列的匹配将多行合并为一行。

父母 组织 物品 价格 dsc1 dsc2
216 1 苹果
217 216 1 苹果手机 500 美元
218 216 217 1 iPhone 加 600 美元
219 216 1 MacBook 900 美元
220 216 219 1 MacBook Pro 1200 美元

我需要这个输出,记下上面的粗体 id,带有 null sub 的项目是 base 并且 subtype 紧随其后:

 Apple $500 iPhone $600 iPhone PLUS
 Apple $900 MacBook $1200 MacBook Pro 

我尝试使用组 concat 但它无法正常工作 https://phpize.online/?phpses=501d07429d08ce3d3092f555d9d6367a&sqlses=c40160db7e24f450d3055397db86aeda&php_version=php8&sql_version=mysql57

另一种选择是如上所述显示多行,然后如果有人知道如何操作,则与 PHP 连接:

select top.item, base.mid, base.sub, base.price, base.item from menu base, menu top 
where top.mid = base.parent and base.parent is not null;
4

2 回答 2

0

您可以使用 MySQL 自连接来执行此操作:

<?php
$stmt = $pdo->query("
SELECT
  `parent_menu`.`item` as `parent_item`,
  `menu`.`price`,
  `menu`.`item`,
  `sub_menu`.`price` as `sub_item_price`,
  `sub_menu`.`item` as `sub_item`
FROM
    `menu`
-- Join the parent brands in if there are any
JOIN
    `menu` as `parent_menu`
ON
    `menu`.`parent` = `parent_menu`.`mid`
-- Join in the subs
JOIN
    `menu` as `sub_menu`
ON
    `menu`.`mid` = `sub_menu`.`sub`");
while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
    echo implode(' ', $row) . "\n";
}

在线试试我

解释:

我们的主要选择语句旨在选择中端、iPhone 和 MacBook。

所有的 mid 都有一个父节点,所以我们可以在主表中的字段等于父菜单连接中的字段menu的地方内连接表。这为我们提供了每个 mid 的 menu_item 值(品牌名称)。parentmid

然后我们可以在菜单表上做另一个内部连接来选择子项目的价格和名称。

最后,通过选择\PDO::FETCH_ASSOC,我们将得到一个如下所示的数组:

[
  'parent_item' => 'Apple',
  'price' => '$500',
  'item' => 'iPhone ',
  'sub_item_price' => '$600',
  'sub_item' => 'iPhone Plus',
]
于 2021-07-15T16:20:52.080 回答
0

评论太长了:

我看不出以下数据集与您在上面发布的内容有何一致。

+=====+========+========+=====+=============+========+========+========+
| mid | parent | sub    | org | item        | price  | dsc1   | dsc2   |
+=====+========+========+=====+=============+========+========+========+
| 1   | (null) | (null) | 1   | Apple       | (null) | (null) | (null) |
+-----+--------+--------+-----+-------------+--------+--------+--------+
| 2   | 1      | (null) | 1   | iPhone      | $1000  | (HI)   | (null) |
+-----+--------+--------+-----+-------------+--------+--------+--------+
| 3   | 1      | 2      | 1   | iPhone Plus | $1221  | (HI)   | (null) |
+-----+--------+--------+-----+-------------+--------+--------+--------+
| 4   | 1      | 2      | 1   | iPhone Red  | $1600  | (HI)   | (null) |
+-----+--------+--------+-----+-------------+--------+--------+--------+
| 5   | 1      | (null) | 1   | iMac        | $900   | (HI)   | (null) |
+-----+--------+--------+-----+-------------+--------+--------+--------+
于 2021-07-15T16:26:49.123 回答