Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 对SQL顺序的限制_Mysql_Select_Restriction - Fatal编程技术网

Mysql 对SQL顺序的限制

Mysql 对SQL顺序的限制,mysql,select,restriction,Mysql,Select,Restriction,在这里提问还是新鲜事,所以这是我第二次尝试解决我面临的问题 我有一张已经按分数排序的桌子。每个记录可以是3种类型中的一种。我想按分数对表格进行重新排序,但在每10条记录中对组合施加额外的限制。特别是,有一个具体的组合,由3种类型中的每一种组成 在下面的示例中,我希望至少有2个类型为C,最多有2个类型为A 我所拥有的 我想要什么 我不认为这可以通过分组或usort有效地解决。我最初的解决方案是导出到PHP并在那里重新排序。我假设您希望返回类型为C的所有行和类型为B的所有行,但最多只返回类型为A的2

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

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

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

我所拥有的

我想要什么


我不认为这可以通过分组或usort有效地解决。我最初的解决方案是导出到PHP并在那里重新排序。

我假设您希望返回类型为C的所有行和类型为B的所有行,但最多只返回类型为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;
试试这个:

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;

1.没有订桌子。2您使用的是什么关系数据库管理系统?如果您使用的是SQL Server>2005,我认为您可以使用RANK获得您想要的。有关更多详细信息,请参阅。不太清楚。我希望每10行进行一次排序。我还希望每10行中至少有2个C型。你能解释一下每10行内排序是什么意思吗?这意味着前10条记录至少有2个C型,后10条记录至少有2个C型,依此类推。这取决于-你还想按分数递减排序吗?如果您希望分数按降序排列,则可能优先于至少每10个2-C和最多每10个2-A的排序要求。您仍然可以使用PHP在处理后手动排序记录
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;
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;