MySQL按顺序排列多个列

时间:2012-11-07 14:23:28

标签: mysql sql sql-order-by

所以我有一个奇怪的场景,我希望以某种方式订购以下数据。让表格数据为:

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

这样做的最佳方法是什么。我可以考虑在前面和在子句中进行查询,但是我必须考虑所有可能的优先级。

提前致谢。仅供参考,我正在使用它的MySQL。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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条目,那么它们也将被包括在内,但是根据案例/何时的顺序,任何空的预先排序到底部,找到的那些将被分类到最佳。在这种排序中,它会将所有IDColumn条目组合在一起,因为相同的“FinalSortOrder”直接与初步查询中的IDColumn相关联。

答案 2 :(得分: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;