在 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 '');
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 '');