mysql - 使用 mySQL 为每个类别选择两个不同的随机条目

标签 mysql group-by left-join

我有一张看起来像这样的表:

table: Q
---------------------------
|question| scope |  type  |
---------------------------
|  this  |   A   |   1    |
|  that  |   A   |   1    |
|  them  |   A   |   1    |
---------------------------
|  this  |   A   |   2    |
|  that  |   A   |   2    |
|  them  |   A   |   2    |
---------------------------
|  this  |   B   |   1    |
|  that  |   B   |   1    |
|  them  |   B   |   1    |
---------------------------

我需要给定一个范围,我需要从每种类型中提取两个条目。如果范围是 A,可能的解决方案是:

---------------------------
|  this  |   A   |   1    |
|  them  |   A   |   1    |
---------------------------
|  that  |   A   |   2    |
|  this  |   A   |   2    |
---------------------------

我目前正在使用以下 SQL 语句:

SELECT tmp.question, tmp.type, tmp.scope
FROM Q
LEFT JOIN (
SELECT * FROM Q ORDER BY RAND( )
)tmp ON ( Q.type = tmp.type AND tmp.scope = 'A' ) 
GROUP BY tmp.type
ORDER BY Q.type

然而,这只返回每种类型的一个条目,并且由于某种原因返回一个 NULL 行。
因此我的问题是如何优化语句以返回两行并消除 NULL 行?

最佳答案

您可以将排名从 2 更改为您想要为每个类别获得的任何值。

http://www.sqlfiddle.com/#!2/f3946/86

试试这个:

  SELECT x.question,
       x.scope,
       x.type
  FROM (

    SELECT bp.question, bp.scope, bp.type, 
    CASE WHEN bp.type = @type 
         THEN @rownum := @rownum + 1
         ELSE @rownum := 1
         END AS rank,
    @type := bp.type
FROM (select * from Q order by rand()) bp
JOIN (SELECT @rownum := 0, @type := NULL) r
WHERE bp.scope = 'A'
ORDER BY type
    ) x
 WHERE x.rank <= 2
order by x.type

注意:我使用了旧答案并针对随机化进行了改进。 我得到帮助的旧答案是: Select N records for each category and order by X

关于mysql - 使用 mySQL 为每个类别选择两个不同的随机条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12229893/

相关文章:

mysql - 无法在 Node 中建立持久 mysql 连接

javascript - 在表单提交之前使用 AJAX 更新数据库允许我将新编辑的数据插入到新的 mysql 表中

mysql - 允许在 HAVING 子句中使用别名的性能影响

mysql - MySQL 5 使用 JOIN 和 UNION 时出错

python - pandas 中按组划分的独特值的一年滚动计数

sql - 分组依据在我的声明中不起作用。为什么

sql - 在 WHERE 子句中使用 OR 时,行将从 LEFT JOIN 中删除

ios - 核心数据异常错误 - 无效的获取请求 : HAVING with no GROUP BY with userInfo of (null)

Django ORM。联接子查询

SQL LEFT JOIN、Average 和 WHERE