首页 > 解决方案 > 按部分/比率返回 MySQL

问题描述

这不是一个容易解释的,所以我会尽力而为

我在数据库中有一个问题列表,每个问题都有一个主题

我想从数据库中返回 50 行...简单一点。

我想从数据库中返回 50 行,但是从每个主题中得到几个问题,我不想从每个主题中定义一个确切的数字,我只想让它抓住它可以提供的东西,只要它从每个主题中抓取一些

可以做到这一点的任何想法、线索或 MySQL 函数的名称

我的问题是我什至不知道用什么谷歌来得到我想要的东西,有没有我想要做的事情的名字。

标签: mysql

解决方案


这个问题在不支持分析功能的早期版本的 MySQL 中是一个真正的痛苦。随着 MySQL 8+ 的出现和ROW_NUMBER. 考虑下表和查询:

WITH yourTable AS (
    SELECT 1 AS topic, 'Q1' AS question UNION ALL
    SELECT 1, 'Q2' UNION ALL
    SELECT 1, 'Q3' UNION ALL
    SELECT 1, 'Q4' UNION ALL
    SELECT 1, 'Q5' UNION ALL
    SELECT 2, 'Q1' UNION ALL
    SELECT 2, 'Q2' UNION ALL
    SELECT 2, 'Q3' UNION ALL
    SELECT 2, 'Q4' UNION ALL
    SELECT 2, 'Q5'
)

SELECT topic, question
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY topic ORDER BY rand()) rn
    FROM yourTable
) t
WHERE rn <= 2;

演示

上面的查询将从每个主题中返回最多 2 条随机记录。它使用ROW_NUMBER, 但随机排序。只有一个问题的主题只会返回那个问题。


推荐阅读