0

所以我有一个奇怪的场景,我希望以某种方式对以下数据进行排序。设表数据为:

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

我想根据第三列(其中第 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。

4

3 回答 3

2

我认为这是你需要的:

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);
于 2012-11-07T15:12:46.660 回答
1

如果您实际上可以包含实际的列名,即使是伪造的数据也会更好,但是,我已经将它们命名为与我认为您正在呈现的内容类型相对应。

看来您的第二列是一些“ID”列,并且希望将它们全部组合在一起。因此,按您想要的顺序预查询,但仅针对“优先级”列,忽略其余记录。然后,使用 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

使用“Order By”,它在实际应用@SeqVal 之前对合格数据进行预排序,而@SeqVal 又应以1、2、3、4 等形式返回...

“SortSeqQuery”将首先运行以对任何“优先级”记录进行预限定,并将它们排序并可用。然后,您的“my_data”表是查询的基础,并加入该结果集并根据匹配的 ID 列获取适当的排序序列。如果有没有优先级的 IDColumn 条目,那么它们也将被包括在内,但是基于 case/when 的 order by,任何为 null 的条目都预先排序到底部,找到的条目将被排序到最佳。在该排序中,它将所有 IDColumn 条目分组在一起,因为相同的“FinalSortOrder”直接关联到初步查询中的 IDColumn。

于 2012-11-07T17:07:12.223 回答
0

回答 -

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;
于 2012-11-12T14:38:40.693 回答