2012-05-04 3 views
1

Я делаю следующий запрос в MySQL:Использование MySQL LIMIT на запрос с LEFT JOIN

SELECT wp_posts.post_date, wp_posts.post_content, wp_posts.post_title, wp_posts.ID, wp_terms.name, wp_term_taxonomy.taxonomy 
FROM wp_posts 
LEFT JOIN wp_term_relationships ON (wp_term_relationships.object_id = wp_posts.ID) 
LEFT JOIN wp_term_taxonomy ON (wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id) 
LEFT JOIN wp_terms ON (wp_terms.term_id = wp_term_taxonomy.term_id) 
WHERE 1=1 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish') 
ORDER BY wp_posts.ID DESC 
LIMIT 50 

Это возвращает 50 результатов, как и ожидалось: Но в зависимости от количества на «пост» «терминов», это будет означать неопределенное количество «постов».

Как я могу ограничить его так, что я получаю 25 уникальных wp_posts

WHERE 1=1 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish') 

Но вернуть столько строк, сколько мне нужно в отношении соединяемых wp_terms ...?

Спасибо!

+0

делает 'уникальную/отличную' работу в' select statement'? – sarwar026

ответ

0

Если из-за объединения LEFT может быть более одной записи для данного идентификатора, я бы предварительно запросил ваши сообщения, последние 25 идентификаторов, которые квалифицируются как ваши левые соединения, являются необязательными, и вы всегда получаете ID. Ограничьте это до 25. Теперь, применяя ORDER BY к JustLast25.ID, поместите столько последовательно назначенных записей вместе с ним. Таким образом, ваши 25 идентификаторов могут генерировать 200 записей, но для каждого идентификатора им будет назначена последовательность из 1, 2, 3 и т. Д.

После этого все завернутые, чтобы получить 50 лимит записи, но при условии, что у вас есть все 25 ваших идентификаторов, вам необходимо повторно запросить их, но измените порядок на последовательность FIRST, затем идентификатор, чтобы вы получили 1-ю запись для всех возможных, затем 2-го для всех возможных, затем 3-й и т. д. У некоторых может быть никаких записей, но минимум, они будут включены в список один раз. Для тех, которые имеют более одного, их дополнительные записи будут появляться после первого запуска

select 
     PreQualify.* 
    from 
     (SELECT 
       JustLast25.post_date, 
       JustLast25.post_content, 
       JustLast25.post_title, 
       JustLast25.ID, 
       wp_terms.name, 
       wp_term_taxonomy.taxonomy, 
       @lastSeq := if(@lastID = JustLast25.id, @lastSeq +1, 1) as SeqPerID, 
       @lastID := JustLast25.ID 
      FROM 
       (select @lastID := 0, @lastSeq := 0) sqlvars, 
       (select wp_posts.* 
        from wp_posts 
        where wp_posts.post_type = 'post' 
         AND wp_posts.post_status = 'publish' 
        ORDER BY 
         wp_posts.ID DESC 
        LIMIT 25) JustLast25 

       LEFT JOIN wp_term_relationships 
        ON JustLast25.ID = wp_term_relationships.object_id 
        LEFT JOIN wp_term_taxonomy 
         ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id 
         LEFT JOIN wp_terms 
          ON wp_term_taxonomy.term_id = wp_terms.term_id 
      order by 
       JustLast25.ID DESC) PreQualify 
    order by 
     PreQualify.SeqPerID, 
     PreQualify.ID DESC 
    LIMIT 50 

Теперь, если вы хотите, чтобы они все быть сгруппированы со всеми записями рядом с их последовательно квалифицированными проводками, вам придется оберните этот еще один уровень в

select 
     FinalSet.* 
    from 
     (full query from above) FinalSet 
    order by 
     FinalSet.ID DESC, 
     FinalSet.SeqPerID