替代使用' LIMIT'在MySQL内部#NOT;不在'条款?

时间:2016-10-07 21:26:48

标签: mysql database limit

我有一张标签表和一个节目表。每个节目每个都有大约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名的标签,我无法弄清楚原因:\

2 个答案:

答案 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