php - MYSQL:选择按字母顺序排序的父项与按字母顺序排序的子项分组

标签 php mysql database sorting

我做了一个简单的表格来理解父子关系,但我似乎没有得到正确的结果。我要整理一下

  1. 首先按'name'字段的字母顺序排列,只有那些没有 parent 的人(parent_id==0)
  2. 但是,只要父级有子行,它们就应该在父级之后打印,并按名称的字母顺序排序。

示例表:

============================================= =============

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;

--
-- Dumping data for table `test`
--

INSERT INTO `test` (`id`, `parent_id`, `name`) VALUES
(1, 4, 'Zorg'),
(2, 0, 'Woordolack'),
(3, 4, 'Akriller'),
(4, 0, 'Metabrusher'),
(5, 2, 'Intersplitter'),
(6, 0, 'Beaverbrain'),
(7, 4, 'Torgeoruos'),
(8, 2, 'Deptezaurus');

============================================= =============

这是我想使用 PHP 输出到网络浏览器的内容:

 Beaverbrain
 Metabrusher
 -> Akriller
 -> Torgeoruos
 -> Zorg
 Woordolack
 -> Deptezaurus
 -> Intersplitter

============================================= =============

我应该说这是一个示例表,只是为了展示这个想法,因此可以通过任何方式对其进行修改以获得正确的结果。

最佳答案

你可以试试这个查询

SELECT IF(child = '',parent,CONCAT('->',child)) as value 
FROM
    (SELECT parent.name as parent,child.name as child
     FROM test parent 
       INNER JOIN 
       (SELECT id,parent_id,name FROM test 
        UNION 
        SELECT null,id,'' FROM test
        WHERE parent_id = 0)child
     WHERE parent.parent_id = 0
     AND child.parent_id = parent.id
     ORDER BY parent,child
     )parent_child

sqlFiddle

查询所做的是 INNER JOIN test with test 并找出哪些是父项和子项。内部 UNION SELECT null,id,'' FROM test WHERE parent_id = 0 创建一个空的 child(ren) 用于显示目的。然后 outter SELECT 查看子项是否为 '' 它打印出父项,否则它在子项前面连接 -> 。这样您就可以得到想要的结果。

下面的版本可能会快一点。因为我们将只创建具有 NULL 子级的父级而不是将子级用作 INNER JOIN 的一部分(如上)。

SELECT IF(child IS NULL,parent,CONCAT('->',child)) as value 
FROM
 (SELECT parent.name as parent,child.name as child
    FROM test parent 
   INNER JOIN test child ON child.parent_id = parent.id
   WHERE parent.parent_id = 0
  UNION
  SELECT test.name as parent,NULL as child    #This creates a NULL child row
    FROM test WHERE test.parent_id = 0        #for parent display purpose
  ORDER BY parent,child
 )parent_child

sqlFiddle

不过,我会改用下面的查询,并在 PHP 内部检查 isParent 标志是 1 还是 0,然后显示相应的字段。

SELECT 0 as isParent,parent.name as parent,child.name as child,
       parent.id as parentId,child.id as childId
  FROM test parent 
 INNER JOIN test child ON child.parent_id = parent.id
 WHERE parent.parent_id = 0
UNION
SELECT 1 as isParent,test.name as parent,NULL as child,
       test.id as parentId,NULL as childId
  FROM test WHERE test.parent_id = 0       
ORDER BY parent,child

sqlFiddle

关于php - MYSQL:选择按字母顺序排序的父项与按字母顺序排序的子项分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21300334/

相关文章:

php - "Property access is not allowed yet"使用准备语句时的警告

php - 如何使用特定订单进行更新

MySQL 奇怪的字符替换为 <BR

php - 在mysql中group by时获取最大可能性值

mysql - 不搜索字段和进行 %""% 搜索之间的区别

php - 使用 preg_replace 从创建表中动态删除 int

php - 是否可以将文件直接上传到 Google Cloud Storage?

javascript - 如何从 mysql 在图形栏中显示数据

mysql - 子句中的 COUNT HAVING + GROUP BY

mysql - 在 SQL 中正确使用表之间的多对多关系?