You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL按厂商分组排序并添加组标题(PHP实现)

解决MySQL数据按厂商分组并带标题输出的问题

首先看你给出的原始数据格式,明显是表结构没做规范化设计(厂商和零件信息混在列里),这会给分组操作带来不必要的麻烦。我先给你两种解决方案:一种是先把表结构改成符合数据库范式的,另一种是如果没法修改现有表结构,怎么处理非规范化的数据。


方案一:先规范化表结构(推荐)

首先把表调整成每个零件对应一条记录的结构,这是数据库设计的最佳实践:

1. 创建规范化表

CREATE TABLE parts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    part_name VARCHAR(100) NOT NULL,
    make VARCHAR(50) NOT NULL
);

2. 插入数据

INSERT INTO parts (id, part_name, make) VALUES
(1, 'Stabilizer', 'Hyundai'),
(2, 'Track Control', 'Hyundai'),
(3, 'Axial Joint', 'Nissan'),
(4, 'Stabilizer', 'Nissan'),
(5, 'Stabilizer', 'Peugeot');

3. PHP实现分组输出

接下来用PHP连接数据库,查询数据并按厂商分组输出:

数据库连接与查询

<?php
// 替换成你的数据库配置
$host = 'localhost';
$dbname = 'your_db';
$username = 'your_user';
$password = 'your_pwd';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 按厂商、id排序查询
    $stmt = $pdo->query("SELECT id, part_name, make FROM parts ORDER BY make, id");
    $parts = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}
?>

分组输出逻辑(匹配你要的格式)

<?php
$current_make = null;
$output = '';

foreach ($parts as $part) {
    // 遇到新厂商时添加厂商标题
    if ($part['make'] !== $current_make) {
        if ($current_make !== null) {
            $output .= ' | ';
        }
        $output .= htmlspecialchars($part['make']);
        $current_make = $part['make'];
    }
    // 添加当前零件信息
    $output .= ' ' . htmlspecialchars($part['id']) . ' | ' . htmlspecialchars($part['part_name']);
}

// 补全结尾的分隔符
$output .= ' | ';
echo $output;
?>

运行后会输出你期望的格式:
Hyundai 1 | Stabilizer | 2 | Track Control | Nissan 3 | Axial Joint | 4 | Stabilizer | Peugeot 5 | Stabilizer |


方案二:不修改现有表结构(处理非规范化数据)

如果没法改动现有表,我们可以用SQL的UNION ALL把分散的列转成结构化数据,再进行分组:

1. 转换数据的SQL查询

假设你的原始表结构是按makeN和partN成对存储的,用下面的查询把数据转成规范化格式:

SELECT 1 AS id, part1 AS part_name, make1 AS make FROM original_parts
UNION ALL
SELECT 2 AS id, part2 AS part_name, make2 AS make FROM original_parts
UNION ALL
SELECT 3 AS id, part3 AS part_name, make3 AS make FROM original_parts
UNION ALL
SELECT 4 AS id, part4 AS part_name, make4 AS make FROM original_parts
UNION ALL
SELECT 5 AS id, part5 AS part_name, make5 AS make FROM original_parts
WHERE make IS NOT NULL;

2. PHP处理逻辑

把上面的SQL替换方案一中的查询语句,剩下的分组输出代码完全复用即可。

内容的提问来源于stack exchange,提问作者Ricardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:28:13