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

そのデータを列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です。

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

偽のデータでも実際の列名を含めることができればいいのですが、提示しているコンテンツの種類に応じて名前を付けています。

2番目の列は「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

「OrderBy」を使用すると、@ SeqValを実際に適用する前に、修飾されたデータが事前に並べ替えられ、1、2、3、4などとして返されます。

「SortSeqQuery」が最初に実行され、「優先」レコードが事前に修飾され、ソートされて使用可能になります。次に、「my_data」テーブルがクエリの基礎となり、その結果セットに結合し、一致するID列に基づいて適切な並べ替えシーケンスを取得します。優先度のないIDColumnエントリがある場合は、それらも含まれますが、大文字と小文字の区別に基づく順序で、nullが下に事前に並べ替えられ、見つかったものは下に並べ替えられます。上。そのソート内では、同じ「FinalSortOrder」が予備クエリでIDColumnに直接関連付けられているため、すべての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 に答える