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