我有一张看起来像这样的表:
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/