[英]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.