Предел подзапроса MySQL WhereIN

Скажем, у меня есть этот массивный запрос:

SELECT
    entity_documents.id,
    entity_fields.name,
    entity_document_fields.value,
    entity_documents.created_at,
    entity_documents.updated_at

FROM entity_documents

LEFT JOIN entity_document_fields
    ON entity_documents.id = entity_document_fields.entity_document_id

LEFT JOIN entity_fields
    ON entity_document_fields.entity_field_id = entity_fields.id

WHERE entity_documents.id IN (
    SELECT
        entity_document_fields.entity_document_id

    FROM entities

    LEFT JOIN entity_fields
        ON entities.id = entity_fields.entity_id

    LEFT JOIN entity_document_fields
        ON entity_fields.id = entity_document_fields.entity_field_id

    WHERE entities.name = "Pages"
    AND entity_fields.name = "Slug"
    AND entity_document_fields.value = '/'

    LIMIT 10
);

Когда я запускаю это, MySQL выдает следующую ошибку:

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Есть ли способ обойти эту проблему?

Я использую MySQL 5.5.34. Нужно ли мне обновляться или есть лучшее решение для ограничения моего подзапроса?

заранее спасибо


person frietkot    schedule 16.04.2014    source источник
comment
возможный дубликат MySQL - Эта версия MySQL еще не поддерживает подзапрос LIMIT & IN/ALL/ANY/SOME, а также этот   -  person Michael Berkowski    schedule 17.04.2014


Ответы (1)


Переместите условие в предложение from:

SELECT
    entity_documents.id,
    entity_fields.name,
    entity_document_fields.value,
    entity_documents.created_at,
    entity_documents.updated_at

FROM entity_documents LEFT JOIN
     entity_document_fields
     ON entity_documents.id = entity_document_fields.entity_document_id LEFT JOIN 
     entity_fields
     ON entity_document_fields.entity_field_id = entity_fields.id JOIN
     (SELECT DISTINCT entity_document_fields.entity_document_id
      FROM entities LEFT JOIN
           entity_fields
           ON entities.id = entity_fields.entity_id LEFT JOIN
           entity_document_fields
           ON entity_fields.id = entity_document_fields.entity_field_id
      WHERE entities.name = 'Pages' AND
            entity_fields.name = 'Slug' AND
            entity_document_fields.value = '/'
      LIMIT 10
     ) filter
     on filter.entity_document_id =  entity_documents.id;

distinct не нужен, если вы знаете, что значения, возвращаемые подзапросом, уже уникальны.

person Gordon Linoff    schedule 16.04.2014