SQL命令的限制

时间:2013-01-04 17:32:35

标签: mysql select restriction

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

我有一张已按分数排序的表格。每条记录可以是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或以有效的方式解决。我最初的解决方案是导出到PHP并在那里进行重新排序。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;