我有一张标签表和一张节目表。每个节目都有大约 100 个标签,但我只想为每个节目提取 30 个标签。
我想选择 30 个标签的方法是首先根据受欢迎程度(点击次数)提取前 20 个标签。
然后我想随机选择 10 个未出现在前 20 个标签中的标签,将它们全部连接在一起并按字母顺序排列。
“tags”表包含 4 列:ID、show_id、tag 和 hit_count
我不擅长 SQL,但这是我想出的:
SELECT * FROM (
(
SELECT tag
FROM tags
WHERE show_id = x
AND ID NOT IN
(SELECT ID
FROM tags
WHERE show_id = x
ORDER BY hit_count DESC
LIMIT 20)
ORDER BY RAND() DESC
LIMIT 10
)
UNION
(
SELECT tag
FROM tags
WHERE show_id = x
ORDER BY hit_count DESC
LIMIT 20
)
) AS reorder
ORDER BY reorder.tag ASC
但是,MySQL 返回以下错误:
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
如果我的 MySQL 版本不支持在“NOT IN”子句中使用“LIMIT”,那么我需要完全重新考虑 SQL,但我正在努力寻找解决方案。谁能帮忙?谢谢。
更新:
作为选择随机 10 个标签的替代方法,我还尝试了:
SELECT * FROM (
SELECT tag
FROM tags
WHERE show_id = x
ORDER BY hit_count DESC
LIMIT 20,100
) AS rnd_10 ORDER BY RAND() LIMIT 10
但是这会返回一些应该限制在前 20 个的标签,我不明白为什么:\
最佳答案
您可以左联接派生表而不是使用 IN(子查询)
SELECT t.tag
FROM tags t
LEFT JOIN (
SELECT ID
FROM tags
WHERE show_id = x
ORDER BY hit_count DESC
LIMIT 20
) b ON b.ID = t.ID
WHERE t.show_id = x AND b.ID IS NULL
ORDER BY RAND() DESC
LIMIT 10
另一种使用子查询的方式,如果你有关系:
select * from tags where hit_count < (
select hit_count from tags order by hit_count desc limit 1 offset 19
) order by rand() limit 10
关于mysql - 在 MySQL 'LIMIT' 子句中使用 'NOT IN' 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39926044/