0

在这里提问还是新手,所以这是我第二次尝试解决我面临的问题。

我有一张已经按分数订购的桌子。每个记录可以是 3 种类型之一。我想按分数对表格重新排序,但对每 10 条记录的组合施加额外的限制。特别是,有由 3 种类型中的每一种组成的特定组合。

在下面的示例中,我希望至少有 2 个 C 型,最多 2 个 A 型

我有的

------------------------------------------
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 的行,但最多只返回 2 行 TYPE=A 的行。

这将在 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 回答