我有一张标签表和一个节目表。每个节目每个都有大约100个标签,但我只想为每个节目提取30个标签。
我想要选择30个标签的方法是首先根据受欢迎程度(点击次数)提取前20名。
然后我想选择10个不会出现在前20名中的随机标签,将它们全部加在一起并按字母顺序排列。
"标签"表格包含4列: ID , show_id ,代码和 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版本不支持使用' LIMIT'在' NOT IN'然后我需要完全重新思考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名的标签,我无法弄清楚原因:\
答案 0 :(得分:2)
您可以离开加入派生表而不是使用IN (subquery)
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
答案 1 :(得分:-1)
为什么在子查询中使用LIMIT。您可以在查询结束时使用它。像这样的东西 -
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)
ORDER BY RAND() DESC
)
UNION
(
SELECT tag
FROM tags
WHERE show_id = x
ORDER BY hit_count DESC
)
) AS reorder
ORDER BY reorder.tag ASC
LIMIT 20