我在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而言,返回尽可能多的行...?
谢谢!
答案 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