Mysql 通过UNION ALL中的两个字段进行选择并在行之间排序

Mysql 通过UNION ALL中的两个字段进行选择并在行之间排序,mysql,sql,Mysql,Sql,我有一个小问题,我有一个名为categories的MySQL表,看起来是这样的: | id | parent_id | name | position | status | ... | | 1 | 0 | A | 1 | 1 | ... | | 2 | 1 | A1 | 2 | 1 | ... | | 3 | 2 | A2 | 1 | 1 | ... | |

我有一个小问题,我有一个名为categories的MySQL表,看起来是这样的:

| id | parent_id | name | position | status | ... |
| 1  |    0      |  A   |     1    |    1   | ... |
| 2  |    1      |  A1  |     2    |    1   | ... |
| 3  |    2      |  A2  |     1    |    1   | ... |
| 4  |    1      |  A3  |     1    |    1   | ... |
| 5  |    0      |  B   |     2    |    1   | ... |
基本上是一个包含所有具有多级深度的类别的表,作为子类别的每个类别都有一个
parent\u id>0
。在任何给定的时间,我都会使用下面的SQL语句仅选择具有
parent\u id=0
的顶级类别及其具有parent\u id=id且parent\u id=0的类别的第一级子类别

SELECT * FROM categories WHERE parent_id = 0 UNION ALL SELECT c.* FROM categories c
INNER JOIN categories p ON c.parent_id = p.id WHERE p.parent_id
1。问题

这将始终选择所有类别,即使它们的状态为0,这是一个问题。因此,我尝试将
和status=1
添加到这两个
WHERE
语句中,但这并不起作用,因为无论状态如何,所有类别都会被选中

我尝试的第二件事是,因为在第一次选择中,我只选择父id=0的类别,然后与父id与第一次选择中的id匹配的所有类别进行联合,我可以只将
和status=0
添加到第一个
选择where
,然后添加到具有status的父类别0将不会被选中,因此,当建立联合时,它的子项也不会被选中。但是,如果我只是将
和status=1
添加到第一个
位置
,那么我只会得到父id&status=1的类别,并且在联合中不会发生任何事情

2。问题
一旦我做了这个选择,我就必须按照位置值对类别和子类别进行排序,这可以在PHP中使用排序函数来完成,但是当你有大约8000个类别时,这是相当扩展的

我尝试按id ASC添加订单,位置ASC。在我的最后一个
WHERE
语句之后,我想要它,这样我就可以得到如下输出:

| id  | parent_id | position |
|  1  |    0      |     1    |
|  3  |    1      |     1    |
|  6  |    1      |     2    |
|  2  |    0      |     2    |
|  4  |    2      |     1    |
甚至:

| id  | parent_id | position |
|  1  |    0      |     1    |
|  2  |    0      |     2    |
|  3  |    1      |     1    |
|  6  |    1      |     2    |
|  4  |    2      |     1    |
我认为第二个例子是相当琐碎的,当我的声明没有包括所有工会成员时,我就开始工作了。但对于UNION,我的语句就像status=1一样,只返回父类别

SELECT * FROM categories WHERE parent_id = 0 UNION ALL SELECT c.* FROM categories c
INNER JOIN categories p ON c.parent_id = p.id WHERE p.parent_id ORDER BY parent_id ASC, position ASC;

由于所有的家长都有家长id=0,他们将首先被列出,但顺序是按职位排列的,然后所有的孩子将首先按家长id排列,然后按职位排列。

如果我理解正确,我想您需要以下信息:

SELECT DISTINCT c.* FROM categories c, categories p
WHERE c.status<>0 and (c.parent_id = 0 OR (c.parent_id=p.id and p.parent_id=0))
ORDER BY c.id,c.position
从类别c、类别p中选择不同的c.*
其中c.status0和(c.parent\u id=0或(c.parent\u id=p.id和p.parent\u id=0))
按c.id、c.position订购

您可以创建吗?类似于此,但这会多次选择所有类别。