1

我在 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 的尽可能多的行...?

谢谢!

4

1 回答 1

0

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

完成后,为了获得 50 条记录的限制,但确保您拥有所有 25 个 ID,您需要重新查询,但将顺序更改为 FIRST 序列,然后是 ID,以便您获得所有可能的第一个条目,然后获得所有可能的第 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
于 2012-05-04T16:02:01.667 回答