我在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吗?
完成由于
答案 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
是一个返回0
或1
的布尔表达式。 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