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

LEFT 結合が原因で、特定の 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

ここで、それらすべてを、順次修飾された転記の横にあるすべてのレコードでグループ化する場合は、それをもう 1 レベル上にラップする必要があります。

select
      FinalSet.*
   from
      ( full query from above ) FinalSet
   order by
      FinalSet.ID DESC,
      FinalSet.SeqPerID
于 2012-05-04T16:02:01.667 に答える