MYSQL-Error'LIMIT& IN / ALL / ANY / SOME子查询'

时间:2015-09-24 21:50:11

标签: mysql sql

我有一个MYSQL-Query必须去,但它返回错误'LIMIT & IN/ALL/ANY/SOME subquery'

SELECT *
FROM page p
WHERE p.page_id IN (
    SELECT c.cl_from
    FROM categorylinks
    WHERE c.cl_from = p.page_id
    AND c.cl_to IN (
        'Art-Rock-Band',
        'Echo-Pop-Preisträger',
        'Englische_Band',
        'Genesis_(Band)',
        'Grammy-Preisträger',
        'Peter_Gabriel',
        'Phil_Collins',
        'Popband',
        'Progressive-Rock-Band',
        'Rock_and_Roll_Hall_of_Fame'
    )
    LIMIT 0,5
);

要解释我想要的东西:我希望只有IN中的每个类别的5个结果 - Clausle。

MYSQL-版本:5.5.44-0ubuntu0.14.04.1 - (Ubuntu)

2 个答案:

答案 0 :(得分:1)

您不能将IN与具有limit的子查询一起使用。最简单的(但可能不是最快的 - 不测试它)解决方案是在限制的附近添加第二个子查询,没有限制。

所以这个:

field IN (SELECT ... FROM x LIMIT 5)

会成为这个

field IN (SELECT * FROM (SELECT ... FROM x LIMIT 5) temp_table)

在您的情况下,您将成为以下内容:

SELECT *
FROM page p
WHERE p.page_id IN (SELECT * FROM(
    SELECT c.cl_from
    FROM categorylinks c
    WHERE c.cl_from = p.page_id
    AND c.cl_to IN (
        'Art-Rock-Band',
        'Echo-Pop-Preisträger',
        'Englische_Band',
        'Genesis_(Band)',
        'Grammy-Preisträger',
        'Peter_Gabriel',
        'Phil_Collins',
        'Popband',
        'Progressive-Rock-Band',
        'Rock_and_Roll_Hall_of_Fame'
    )
    LIMIT 0,5
) temp_table);

您还可以尝试在内部联接中转换子查询 - 这也应该有效。

答案 1 :(得分:0)

编辑: 似乎您的请求被误解了。

即使没有语法错误,您建议的查询也无法为每个类别返回5个结果。

为此,我建议你看一下这篇文章: Get top n records for each group of grouped results

根据错误消息,您不能在子查询中使用限制。

您应该考虑在查询中使用JOINS:

SELECT p.*
FROM categorylinks c
JOIN page p ON p.page_id = c.cl_from
WHERE c.cl_from = p.page_id
AND c.cl_to IN (
    'Art-Rock-Band',
    'Echo-Pop-Preisträger',
    'Englische_Band',
    'Genesis_(Band)',
    'Grammy-Preisträger',
    'Peter_Gabriel',
    'Phil_Collins',
    'Popband',
    'Progressive-Rock-Band',
    'Rock_and_Roll_Hall_of_Fame'
)
LIMIT 0,5;