1

以下のようなテーブルがあるとしましょう。

create table t1 (id INT, tempData varchar(25));

およびデータとして

insert into t1 values
(01, 'value 01'),
(02, 'value 02'),
(03, 'value 03'),
(04, 'value 04'),
(05, 'value 05'),
(06, 'value 06'),
(07, 'value 07'),
(08, 'value 08'),
(09, 'value 09'),
(10, 'value 10'),
(11, 'value 11'),
(12, 'value 12');

今私が欲しいのは、以下の形式でデータを取得するためのクエリを作成することです

+++++++++++++++++
Id  + tempData
+++++++++++++++++
03  + value 03
09  + value 09
01  + value 01
// now random order except above three ids
04  + value 04
06  + value 06
.
.
.
+++++++++++++++++

最初の行を03、次に09、次に01、そして任意のランダムな順序にします。

これを行う方法について何か提案はありますか?

sqlfiddleのデータ


編集1

私は巨大なデータベースを持っており、注文のために約1200のIDを持っています。だから私はそれらを手動で書くことはできません。数を言うことができる他の方法はあります3,9,1か?

4

3 に答える 3

1
select * from t1 order by (id = 3) desc, (id = 1) desc, (id = 9) desc, rand();

また、フィドルをありがとう。SQLの質問をする人が少なすぎるため、SQLについて知っているか、わざわざ作成する必要があります。

ポストエディット

スキーマ:

create table t2 (prio INT PRIMARY KEY, t1_id INT);

insert into t2 values (3, 3), (2, 1), (1, 9);

クエリ:

select t1.*
from t1
left join t2 on t1.id = t2.t1_id
order by t2.prio desc, rand();
于 2012-11-22T09:57:40.670 に答える
0

これを試して:

ORDER BY 
  CASE id
    WHEN 3 THEN -3
    WHEN 9 THEN -2
    WHEN 1 THEN -1
    ELSE 0
  END, Rand(); 

更新1:代わりにこれを試してください:

SELECT t1.*
FROM t1
LEFT JOIN
(
    SELECT -1 sortorder, 3 ID
    UNION ALL
    SELECT -2, 9
    UNION ALL
    SELECT -3, 1
) t2 ON t1.ID = t2.ID
ORDER BY t2.sortorder DESC, Rand();

SQLフィドルデモ

于 2012-11-22T09:59:04.250 に答える
0

このORDERBYを試してください-

SELECT
  *
FROM
  t1
ORDER BY
  CASE id WHEN 3 THEN -3 WHEN 9 THEN -2 WHEN 1 THEN -1 ELSE RAND() END

CREATE TABLE t2(id INT PRIMARY KEY AUTO_INCREMENT, sort_id INT);
INSERT INTO t2 VALUES(NULL, 3),(NULL, 9),(NULL, 1);

SELECT t1.*, t2.* FROM t1
  LEFT JOIN t2
    ON t1.id = t2.sort_id
ORDER BY IFNULL(t2.id - 100000000, RAND())

... 100000000は、MAX(id)を省略するために使用されます。

于 2012-11-22T10:01:32.137 に答える