mysql - 在 MySQL 'LIMIT' 子句中使用 'NOT IN' 的替代方案?

标签 mysql database limit

我有一张标签表和一张节目表。每个节目都有大约 100 个标签,但我只想为每个节目提取 30 个标签。

我想选择 30 个标签的方法是首先根据受欢迎程度(点击次数)提取前 20 个标签。

然后我想随机选择 10 个未出现在前 20 个标签中的标签,将它们全部连接在一起并按字母顺序排列。

“tags”表包含 4 列:IDshow_idtaghit_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/

相关文章:

MySQL sql转储错误的字符编码

database - 限制允许的记录数

xml - Xpath,为什么两者都匹配?

sql - 使用 sqlite 时如何打印 SQLITE_MAX_COMPOUND_SELECT?

mysql - 查询以获取每个日期出席的所有客人

Mysql 值作为标签矩阵

database - 如何使用 Gramex FormHandler 动态(在运行时)创建或更改数据库架构

java - 方法空间不足?

php - $_SESSION 不在页面之间传递值 php

php - MySQL语法错误