MySQL:选择第n行,其中至少有一行具有属性集?

时间:2014-05-22 18:13:01

标签: mysql sql select having

我在MySQL中有一个名为 words 的表。

一列称为(实际字),另一列称为特殊

我正在尝试执行一个查询 - 如果可能的话 - 应该这样做:

SELECT word FROM words WHERE special = 1 AT LEAST ONCE

这是一个伪类查询,但我想要的是从我的单词表中随机获得第n条记录,其中至少有一个单词的特殊属性设置为1。 / p>

这意味着如果是这种情况,所有第n条记录都允许为1,或者除了第n条记录之外的所有记录都可以特殊 = 0但是必须至少有一条记录具有特殊 = 1。

我尝试过类似的事情: SELECT * FROM words HAVING COUNT(isNum = 1) > 1 ORDER BY RAND() LIMIT 10或类似的东西..它没有给我我想要的结果,实际上它只返回一个结果。

这可以通过SQL吗?

完成

由于

2 个答案:

答案 0 :(得分:1)

这是一种应该相对有效的方法。它选择一个随机的"特殊"单词,然后是n + 1个其他单词(可能包含第一个单词)。它命令他们保证随机的第一个,然后选择其中的一个。

select word
from ((select word, 0 as ordering
       from words
       where special = 1
       order by rand()
       limit 1
      ) union all
      (select word, rand() as ordering
       from words
       limit n
      )
     ) t
group by word
order by min(ordering)
limit n;

答案 1 :(得分:1)

SELECT *
FROM words
HAVING COUNT(special = 1) > 1
ORDER BY RAND()
LIMIT 10

在没有COUNT()的情况下使用GROUP只计算记录数并返回1行,然后将HAVING子句应用于该行,从而在结果集中产生一条记录。 / p>

如果您将COUNT()添加到SELECT子句中,您会发现自己的错误:

SELECT COUNT(special = 1), words.*
FROM words
HAVING COUNT(special = 1) > 1
ORDER BY RAND()
LIMIT 10

计数后返回的记录是不确定的。

因此,您必须添加GROUP BY以获取多个记录(每个单词一个):

SELECT *
FROM words
GROUP BY word
HAVING COUNT(special = 1) > 1
ORDER BY RAND()
LIMIT 10

现在,你会发现它会返回所有包含多条记录的单词,无论它是否有special = 1

那是因为special = 1是一个返回01的布尔表达式。 COUNT()COUNT(0)都会COUNT(1)递增。实际上,除了COUNT(NULL)之外,它会增加。现在,您意识到您真的想要SUM()

SELECT *
FROM words
GROUP BY word
HAVING SUM(special = 1) > 1
ORDER BY RAND()
LIMIT 10

或者,也许更直接:

SELECT DISTINCT word
FROM words
WHERE special = 1
ORDER BY RAND()
LIMIT 10