在LEFT JOIN上使用MySQL LIMIT进行查询

时间:2012-05-04 15:30:39

标签: mysql wordpress join limit

我在MySQL中执行以下查询:

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而言,返回尽可能多的行...?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果由于LEFT加入,给定ID可能有多个条目,我会从您的帖子中预先查询,最近25个符合左联接条件的ID是可选的,并且您总是得到ID。将此限制为25.现在,将ORDER BY应用于JustLast25.ID时,将同时放置多个顺序分配的条目。因此,您的25个ID可以生成200个条目,但是对于每个ID,它们将被分配1,2,3等的序列...

在完成所有操作之后,为了获得50个记录限制,但确保您拥有所有25个ID,您需要重新查询,但是将顺序更改为序列FIRST,然后是ID,所以你得到每个可能的第一个条目,然后每个可能的第二个条目,然后第三个等等......有些可能没有条目,但最低限度,它们将被列入列表一次。对于那些有多个的人,他们的额外记录将在第一次运行后出现

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