0

ここで質問するのはまだ初めてなので、これは私が直面している問題への 2 回目の試みです。

スコアによって既に並べ替えられているテーブルがあります。すべてのレコードは、3 つのタイプのいずれかになります。スコアでテーブルを並べ替えたいのですが、10 レコードごとにミックスに追加の制限を課します。特に、3つのタイプのそれぞれからなる特定のミックスがあります。

以下の例では、タイプ C を少なくとも 2 つ、タイプ A を最大 2 つ使用したいと考えています。

私が持っているもの

------------------------------------------
ID      Score      Type
------------------------------------------
1       100         A
2       99          B
3       97          B
4       92          A
5       91          C
6       85          A
7       83          B
8       81          B
9       75          B
10      70          B
11      65          A
12      61          C
13      59          B

私が欲しいもの

------------------------------------------
ID      Score      Type
-----------------------------------------
1       100         A
2       99          B
3       97          B
4       92          A
5       91          C
7       83          B
8       81          B
9       75          B
10      70          B
12      61          C

これは Group By や usort で効率的に解決できるとは思えません。私の最初の解決策は、PHP にエクスポートし、そこで並べ替えを行うことでした。

4

2 に答える 2

0

TYPE = Cのすべての行が返され、TYPE = Bのすべての行が返されることを想定していますが、TYPE=Aの行は最大で2行だけ返されます。

これはORACLEで機能します-ROWNUMをサブクエリで使用して、行数を制限できます。

(別のデータベースでは、ROWNUMは実装されていない可能性があります)

SELECT 
T.*
FROM
(
    select *
    from
    (
            select T.ID, T.SCORE, T.TYPE 
            from YourTable T
            WHERE TYPE='A'
            ORDER BY T.SCORE DESC

    )
    WHERE ROWNUM <=2
    UNION 
    select *
    from
    (
            select T.ID, T.SCORE, T.TYPE 
            from YourTable T
            WHERE TYPE='B'
            ORDER BY T.SCORE DESC

    )

    UNION 
    select *
    from
    (
            select T.ID, T.SCORE, T.TYPE 
            from YourTable T
            WHERE TYPE='C'
            ORDER BY T.SCORE DESC

    )


) T
ORDER BY T.SCORE DESC;
于 2013-01-04T17:54:21.703 に答える
0

これを試して:

SELECT id, score, a.type 
FROM (SELECT id, score, a.type, IF(@lasttype = (@lasttype:=a.type), @index:=@index+1, @index:=0) indx 
      FROM tablename t, (SELECT @lasttype:='', @index:=0) AS a 
      ORDER BY TYPE, score DESC) AS a 
WHERE (a.type NOT IN ('A', 'C') OR (a.type IN ('A', 'C') AND indx <= 2)) 
ORDER BY score DESC;
于 2013-01-04T18:19:07.497 に答える