在 union all 运算符中包含 group by 和 order by 时出错

Error when including group by and order by in union all operator

SELECT productspec_crud.id as id,clause_no FROM design_models 
INNER JOIN productspec_crud ON productspec_crud.prod_id=design_models.prod_id 
WHERE design_models.id = '13' 
union all 
select design_input_general.id,clause_no from design_input_general 
left join design_io on design_io.model_id='13' and design_io.design_input_general_id=design_input_general.id

从上面的工作代码中,我试图包含一些代码来根据两个 select 查询中的 clause_no 值对行进行排序。下面是我想要包含的代码:

JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3
      UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) numbers 
ON LENGTH(clause_no) - LENGTH(REPLACE(clause_no, '.', '')) >= num - 1
GROUP BY id, clause_no
ORDER BY GROUP_CONCAT(CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(clause_no, '.', num), '.', -1) REGEXP '[^0-9]'
                           THEN RPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(clause_no, '.', num), '.', -1), 8, 0) 
                           ELSE LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(clause_no, '.', num), '.', -1), 8, 0) 
                           END ORDER BY num SEPARATOR '');

我以这种方式包含了上面的代码:

(SELECT 
        productspec_crud.id as id,clause_no FROM `design_models` 
        INNER JOIN `productspec_crud` ON `productspec_crud`.`prod_id`=`design_models`.`prod_id`
        JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3
              UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) numbers 
            ON LENGTH(clause_no) - LENGTH(REPLACE(clause_no, '.', '')) >= num - 1)
union all
(select design_input_general.id,clause_no from `design_input_general` 
        left join design_io on design_io.model_id='13' and design_io.design_input_general_id=design_input_general.id
        JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3
              UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) numbers 
            ON LENGTH(clause_no) - LENGTH(REPLACE(clause_no, '.', '')) >= num - 1)) 
GROUP BY id, clause_no
ORDER BY GROUP_CONCAT(CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(clause_no, '.', num), '.', -1) REGEXP '[^0-9]'
                           THEN RPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(clause_no, '.', num), '.', -1), 8, 0) 
                           ELSE LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(clause_no, '.', num), '.', -1), 8, 0) 
                           END ORDER BY num SEPARATOR '');  

当我包含它时,出现以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'GROUP BY `id`, `clause_no` ORDER BY GROUP_CONCAT(CASE WHEN SUBSTRING_INDEX(SU...'

任何人都可以建议将其包含在 union all 运算符中的正确语法。

您必须对联合的子查询使用 GROUP BY

SELECT id, clause_no
FROM
(
    SELECT psc.id AS id, clause_no, num
    FROM design_models dm
    INNER JOIN productspec_crud psc ON psc.prod_id = dm.prod_id
    INNER JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3
          UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) numbers 
        ON LENGTH(clause_no) - LENGTH(REPLACE(clause_no, '.', '')) >= num - 1
    UNION ALL
    SELECT dig.id, clause_no, num
    FROM design_input_general dig
    LEFT JOIN di ON di.model_id = '13' AND di.design_input_general_id = dig.id
    INNER JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3
          UNION SELECT 4 UNION SELECT 5 UNION SELECT 6) numbers 
        ON LENGTH(clause_no) - LENGTH(REPLACE(clause_no, '.', '')) >= num - 1
) t 
GROUP BY id, clause_no
ORDER BY
    GROUP_CONCAT(CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(clause_no, '.', num), '.', -1) REGEXP '[^0-9]'
                      THEN RPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(clause_no, '.', num), '.', -1), 8, 0) 
                      ELSE LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(clause_no, '.', num), '.', -1), 8, 0) 
                 END ORDER BY num SEPARATOR '');