MySQL - 从每个 'group' 中仅选择 2 行

标签 mysql sql database row

我正在尝试创建一个查询,它将用作显示信息的过滤器。

具体来说,我希望此查询最多显示具有相同 position 值的 2 行。

到目前为止我已经编写了这段代码,但它只显示了每个类别中的一个,我不确定我做错了什么,你能帮帮我吗?

SELECT name, surname, position, value, points FROM
    (SELECT name, surname, position, value, points, 
    @num := IF(@type = position, @num + 1, 1) AS row_number,
    @type := position AS dummy 
    FROM players 
    WHERE (name LIKE '%$searchphrase%' OR surname LIKE '%$searchphrase%') 
    AND value >= '$minvalue'
    AND value <= '$maxvalue'
    GROUP BY position) AS x WHERE x.row_number <= 2
ORDER BY
    CASE WHEN $filter=0 THEN points END DESC, 
    CASE WHEN $filter=1 THEN points END ASC,
    CASE WHEN $filter=2 THEN value END DESC,
    CASE WHEN $filter=3 THEN value END ASC,
    CASE WHEN $filter=4 THEN surname END DESC,
    CASE WHEN $filter=5 THEN surname END ASC

最佳答案

你的想法是正确的。但是,MySQL 不保证表达式求值的顺序。另外,您在子查询中有一个按位置分组

所以我想你可能想要:

SELECT . . .
FROM (SELECT name, surname, position, value, points, 
             (@num := if(@type = position, @num + 1,
                         if(@type := position, 1, 1)
                        )
             ) AS row_number
      FROM players p CROSS JOIN
           (SELECT @num := 0, @type := '') params
      WHERE (name LIKE '%$searchphrase%' OR surname LIKE '%$searchphrase%') AND
            value >= '$minvalue' AND value <= '$maxvalue'
      ORDER BY position
     )  x
WHERE x.row_number <= 2

关于MySQL - 从每个 'group' 中仅选择 2 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46310118/

相关文章:

php - 影响删除的 MySQL 存储过程变量名称

mysql - 如何复制列

SQL JOIN 和不同类型的 JOIN

php - 如何在 LIMIT 子句中应用 bindValue 方法?

database - 使用文件系统作为 15M 文件的数据库——效率高吗?

PHP SQL 插入错误

php - 使用php根据时间段拉取mysql数据

asp.net - MySQL Windows 服务无法启动

sql - SQL中的循环行

mysql - MySql : number of rows or size of file? 性能瓶颈