Mysql 在SQL中对不同的合并列进行排序

Mysql 在SQL中对不同的合并列进行排序,mysql,sql,Mysql,Sql,我有以下疑问: SELECT DISTINCT A + ' ' + B + ' ' + C AS 'ABC', D FROM Table ORDER BY A, B 这将显示以下错误消息: ORDER BY items must appear in the select list if SELECT DISTINCT is specified. 我尝试将顺序更改为: ORDER BY A, B, C 'ABC', D 几乎每种可能的组合都有变化,但误差仍然存在 那么我怎样才能得到不同的AB

我有以下疑问:

SELECT DISTINCT A + ' ' + B + ' ' + C AS 'ABC', D
FROM Table
ORDER BY A, B
这将显示以下错误消息:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
我尝试将顺序更改为:

ORDER BY A, B, C 'ABC', D
几乎每种可能的组合都有变化,但误差仍然存在

那么我怎样才能得到不同的ABC和D,首先按A值排序,然后按B值排序?(C和D可以保持未排序,并且不必区分,因为ABC组合已经足以指示唯一值)

编辑:


或者,是否可以在不使用DISTINCT的情况下删除基于A列和B列的重复项

应该使用concat进行字符串连接

SELECT DISTINCT CONCAT(A , ' ' , B , ' ', C) AS ABC, D
FROM Table
ORDER BY 1

由于每列中有多个字母单词,因此需要在派生表或CTE中使用窗口函数进行排序,如下所示:

WITH ordering AS (
    SELECT A,
           B,
           C, 
           D,
           row_number() OVER (ORDER BY A,B,C,D) AS order_num
    FROM Table
)

SELECT DISTINCT A + ' ' + B + ' ' + C AS 'ABC', D
FROM ordering
ORDER BY order_num ASC

编辑:基于评论的新方法

您是否尝试过分组方式

SELECT (A + ' ' + B + ' ' + C) AS 'ABC', D
FROM Table
ORDER BY A, B
GROUP BY (A + ' ' + B + ' ' + C), D
使用:


请勿使用单引号分隔列名!仅对字符串和日期常量使用单引号。如果您这样做了,您的代码将在第一次运行:

SELECT DISTINCT A + ' ' + B + ' ' + C AS ABC, D
FROM Table
ORDER BY ABC;
您可以在上面看到,第2行(
ABD
)排序在一个
AXB
行之后,在另一个
AXB
行之前,正如
order by c1、c2
指定的那样

当您执行
选择DISTINCT
操作时,这两个
AXB
行将仅成为一行-表示表中两个单独的行,一行排序在
ABD
行之前,另一行排序在
ABD
行之后

您不能在
ABD
之前和之后放置重复的
AXB
。这就是为什么

如果选择不同,则“按项目排序”必须出现在“选择”列表中 指定的


多亏了Brock使用“row_number()OVER”的例子,我想到了一种自己使用PARTISION BY的方法

WITH ordering AS 
(
    SELECT 
        A,
        B,
        C,
        D,
        row_number() OVER 
        (
            PARTITION BY
                A,
                B,
                C
            ORDER BY 
                A,
                B,
                C
        ) AS order_num
    FROM
        Table       
)
SELECT A + ' ' + B + ' ' + C AS 'ABC', D
FROM ordering
WHERE order_num = 1
ORDER BY A, B, C

这样,我就不用DISTINCT,而是使用“row_number()OVER(PARTITION BY)”给所有记录一个数字,重复的记录得到一个更大的数字。这允许我过滤顺序为1的记录,以删除所有重复的记录。这样,我可以简单地按原始的3列排序,看到不同不再是查询的一部分。

你不能。错误消息完全有意义。例如
'a X'+'C'
=
“A'+'X C'
,但您不能按其组件排序。似乎按1排序就可以了…@jarlh但为什么我可以按它的组件排序,而它不是独立的?如果没有独立的,就没有“合并”行,即A、B和C值仍然存在。仍然不是有效的ORDER BY。它很接近,但问题是当值A有两个单词,第一个单词也独立出现时。有意义的是,我更新了我的答案。这应该取决于您使用的SQL语法。它仍然给了我相同的错误“如果指定了select DISTINCT,则ORDER BY items必须出现在选择列表中。”但您的代码启发我自己构造了正确的答案,因此非常感谢:)将其作为答案发布。这不会将字符串作为完整的ABC字符串进行排序吗?(因此,如果字符串A包含两个单词,并且第一个单词出现时没有第二个单词,则会出现问题)@A.bakker根据提示编辑答案。这是您想要的吗?按A和B排序不同于将ABC排序为单个字符串。@A.bakker…这是真的。这是我对您真正想要的内容的猜测。
SQL>create table t (id int, c1 varchar(3), c2 varchar(3));
SQL>insert into t values (1,'AX','B');
SQL>insert into t values (2,'AB','D');
SQL>insert into t values (3,'A','XB');
SQL>select concat(c1,c2) from t order by c1, c2;    

======
AXB
ABD
AXB

                  3 rows found
WITH ordering AS 
(
    SELECT 
        A,
        B,
        C,
        D,
        row_number() OVER 
        (
            PARTITION BY
                A,
                B,
                C
            ORDER BY 
                A,
                B,
                C
        ) AS order_num
    FROM
        Table       
)
SELECT A + ' ' + B + ' ' + C AS 'ABC', D
FROM ordering
WHERE order_num = 1
ORDER BY A, B, C