【问题标题】:Error when including group by and order by in union all operator在 union all 运算符中包含 group by 和 order by 时出错
【发布时间】:2022-01-29 06:52:59
【问题描述】:
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

从上面的工作代码中,我试图在两个选择查询中包含一些代码来根据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 运算符中。

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    您必须对联合的子查询使用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 '');  
    

    【讨论】:

    • 感谢您的回答。使用此代码时出现此错误:“订单子句”中的未知列“num”
    • @Hello 我通过在 select 子句中添加 num 来修复它。巨大的查询,没有提供样本数据,很难测试我的答案。
    • 谢谢。如果我想选择另一个字段从表中提取并显示,我应该将它包含在所有三个选择的地方吗?
    • 是的,通过在联合的两半中选择来公开该字段,然后将其添加到最外层的选择中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多