由GROUP_CONCAT()创建的MySQL ORDER BY字段

问题描述 投票:0回答:2

输入两个表,TABLE_ATABLE_B

 TABLE_A       TABLE_B
 A_ID |   A    A_ID |  B        
    1 |   a       1 |  b
    2 |  a1       1 | b1
    3 |  a2       2 | b2

期待输出TABLE C

 TABLE_C
 A_ID |  A | C
    3 | a2 | NULL  <--- NULL if no matched A_ID in TABLE B
    1 |  a | b,b1  <--- Concat all rows in TABLE B with ','
    2 | a1 | b2

以下代码几乎可以给上面的TABLE_C,除了我想先用CNULLDESC字段进行排序。 ORDER BY C IS NULL DESC似乎不起作用。请注意,如果CNULL,则TABLE_C将按A_ID排序,无论字段C中的值如何。

SELECT 
  A1.A_ID, 
  A1.A, 
  GROUP_CONCAT(B1.B SEPARATOR ',') as 'C'
FROM `TABLE_A` A1 
  LEFT JOIN `TABLE_B` B1 
  ON A1.A_ID=B1.A_ID 
GROUP BY A1.A_ID, A1.A;

以下SQL给出了错误。

SELECT 
  A1.A_ID, 
  A1.A, 
  GROUP_CONCAT(B1.B SEPARATOR ',') as 'C'
FROM `TABLE_A` A1 
  LEFT JOIN `TABLE_B` B1 
  ON A1.A_ID=B1.A_ID 
GROUP BY A1.A_ID, A1.A
ORDER BY C IS NULL DESC, A1.A_ID; <--- Order by C with NULL failed.

不支持参考'C'(参考组功能)

mysql sql
2个回答
1
投票

首先按Null值,然后按A1.A_ID使用:

SELECT A1.A_ID, A1.A, GROUP_CONCAT(B1.B SEPARATOR ',') as C 
FROM `TABLE_A` A1 
LEFT JOIN `TABLE_B` B1 ON A1.A_ID=B1.A_ID 
GROUP BY A1.A_ID, A1.A 
ORDER BY (CASE WHEN GROUP_CONCAT(B1.B SEPARATOR ',') IS NULL then GROUP_CONCAT(B1.B SEPARATOR ',') ELSE A1.A_ID END) ;

关于错误Reference 'C' not supported (reference to group function)你应该由'C'订购即

ORDER BY 'C' IS NULL DESC, A1.A_ID; 

而不是ORDER BY C IS NULL DESC, A1.A_ID;


0
投票

你不能按顺序使用Is Null

SELECT 
  A1.A_ID, 
  A1.A, 
  GROUP_CONCAT(B1.B SEPARATOR ',') as 'C'
FROM `TABLE_A` A1 
  LEFT JOIN `TABLE_B` B1 
  ON A1.A_ID=B1.A_ID 
GROUP BY A1.A_ID, A1.A
ORDER BY C, A1.A_ID DESC
© www.soinside.com 2019 - 2024. All rights reserved.