簡體   English   中英

MySQL按一列分組時按多列排序

[英]MySQL order by multiple columns while grouping by one

所以我有一個奇怪的場景,我希望以某種方式對以下數據進行排序。 令表數據為:

abc 111 2     priority
abc 111 blah  data
abc 222 1     priority
abc 222 blah  data
abc 333 3     priority
abc 333 blah  data

我想根據第3列(其中第4列為優先級)對數據進行排序,但將返回順序按第2列分組。因此,預期的查詢結果如下所示:

abc 222 1     priority
abc 222 blah  data
abc 111 2     priority
abc 111 blah  data
abc 333 3     priority
abc 333 blah  data

做到這一點的最佳方法是什么。 我可以考慮先做一個查詢和一個in子句,但是然后我必須考慮所有可能的優先級。

提前致謝。 僅供參考,我正在使用它的MySQL。

我認為這是您需要的:

http://sqlfiddle.com/#!2/48057/14

DDL

CREATE TABLE my_data( 
  name VARCHAR(20),
  num NUMERIC(5), 
  c NUMERIC(3),
  priority NUMERIC(3)
);

DML

INSERT INTO my_data VALUES("abc", 111, 2, 1);
INSERT INTO my_data VALUES("abc", 222, 3, 4);
INSERT INTO my_data VALUES("abc", 222, 1, 9);
INSERT INTO my_data VALUES("abc", 111, 4, 2);

如果您甚至可以在虛假數據中實際包含實際的列名稱,那會更好,但是,我已根據我認為您要呈現的內容類型來命名它們。

看來您的第二列是一些“ ID”列,希望將它們分組在一起。 因此,以您想要的順序進行預查詢,但只查詢“ Priority”列,而忽略其余記錄。 然后,使用MySQL變量,可以為最終輸出分配一個順序值。 然后,將“ ID”列上的常規數據加入其他所有值...類似...

select
      md2.ABCColumn,
      SortSeqQuery.IDColumn,
      md2.DescripColumn,
      md2.ColumnWith123Sequence
   from
      my_Data md2
         LEFT JOIN ( select 
                           md1.IDColumn,
                           @SeqVal := @SeqVal +1 as FinalSortOrder
                        from
                           my_Data md1,
                           ( select @SeqVal := 0 ) sqlvars
                        where
                           md1.DescripColumn = "priority"
                        order by
                           md1.ColumnWith123Sequence,
                           md1.IDColumn ) SortSeqQuery
            on md2.IDColumn = SortSeqQuery.IDColumn 
   order by
      case when SortSeqQuery.IDColumn is null then 2 else 1 end,
      coalesce( SortSeqQuery.FinalSortOrder, 0 ) as FinalSort

使用“排序依據”時,它會在實際應用@SeqVal之前對合格的數據進行預排序,然后依次將其返回為1、2、3、4等。

首先將運行“ SortSeqQuery”以對任何“優先級”記錄進行資格預審,並對其進行排序和使用。 然后,“ my_data”表是查詢的基礎,並加入到該結果集,並根據匹配的ID列獲取適當的排序順序。 如果有沒有優先級的IDColumn條目,那么它們也將被包括在內,但是基於案例的排序方式/當任何空值被預先排序到底部時,找到的那些將被排序到最佳。 在這種排序中,由於相同的“ FinalSortOrder”直接與初步查詢中的IDColumn關聯,因此它將所有IDColumn條目分組在一起。

答案-

CREATE TABLE my_data( name VARCHAR(20),groupid INT(5), attributekey VARCHAR(10),attributevalue VARCHAR(10));

INSERT INTO my_data VALUES("abc", 111, "priority", "2");
INSERT INTO my_data VALUES("abc", 111, "someattr", "blah");
INSERT INTO my_data VALUES("abc", 222, "priority", "1");
INSERT INTO my_data VALUES("abc", 222, "someattr", "blah");
INSERT INTO my_data VALUES("abc", 333, "priority", "3");
INSERT INTO my_data VALUES("abc", 333, "someattr", "blah");

解決方案-

SELECT m1.*,
(select attributevalue from my_data m2
   where m1.groupid=m2.groupid 
   AND m2.attributekey='priority' 
) groupidpriority 
FROM my_data m1
order by groupidpriority;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM