2015-09-24 1 views
-1

У меня есть MYSQL-запрос, который должен идти, но она возвращает ошибку 'LIMIT & IN/ALL/ANY/SOME subquery'MYSQL-Error 'LIMIT & IN/ALL/ANY/SOME подзапрос'

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 
); 

Чтобы объяснить, что я хочу: я хотите только иметь 5 результатов каждой категории, которая находится в IN -Клаузе.

MYSQL-Version: 5.5.44-0ubuntu0.14.04.1 - (Ubuntu)

+0

вы не можете использовать ограничение в подзапросах: https://dev.mysql.com/doc/refman/5.0/en/subquery-restrictions .html Это документы для 5.0, но ограничение все еще находится в 5.7, так что вы SOL –

+0

Вы попробовали мой ответ в своем оригинальном посте? http://stackoverflow.com/questions/32770125/sql-set-limit-for-a-column/32770568#32770568 Он не должен вызывать эту ошибку, потому что нет подзапроса. – CSS

ответ

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); 

Вы также могли бы попытаться превратить ваш подзапрос в внутреннее соединение - это также должно работать.

+0

Вы забыли ссылки на категории с помощью 'c', которые вы добавили в свои поля. Я возвращаю его обратно, @name забыл ... – CSS

+0

он возвращает после того, как ваш псевдоним редактирует ошибку «Каждая производная таблица должна иметь свой собственный псевдоним» – Name

+0

@Name - вы правы - исправлено – Philipp

0

EDIT: кажется, что ваш запрос был неправильно истолкован.

Даже если не было синтаксической ошибки, запрос, который вы предлагаете, не может вернуть 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; 
+0

Вы забыли ссылки на категории слияния с 'c', которые вы добавляете в свои поля. Я беру его обратно, @name забыл ... – CSS

+0

действительно! Благодарю. он был отредактирован ... – Basile

+0

Он возвращает всего 5 результатов. Не 5 результатов для каждой категории. – Name

Смежные вопросы