所以我有一个奇怪的场景,我希望以某种方式订购以下数据。让表格数据为:
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。
答案 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;