4

スクリプトのパフォーマンスを調整しており、投稿カテゴリの並べ替え方法を変更しました。

次のクエリを正常に使用していました。(130|3|4|5) カテゴリの投稿を選択し、1 つの投稿が複数のカテゴリを持つことができるため、(73) カテゴリの初期化もあるかどうかを確認します。

SELECT * 
FROM   post 
       LEFT JOIN post_plus 
              ON ( post.id = post_plus.news_id ) 
WHERE  category REGEXP '[[:<:]](130|3|4|5)[[:>:]]' 
       AND category REGEXP '[[:<:]](73)[[:>:]]' 
       AND approve = 1 
ORDER  BY fixed DESC, 
          date DESC 
LIMIT  0, 7 

新しいクエリでは、代わりに複数の IN (...) クエリを実行する必要がありますAND category REGEXP '...'が、何らかの理由で追加AND categoryid INは常に空の結果を返します。

SELECT *
FROM   post 
       LEFT JOIN post_plus 
              ON ( post.id = post_plus.news_id ) 
       LEFT JOIN post_category 
              ON ( post_category.postid = post.id ) 
WHERE  categoryid IN ( 130, 3, 4, 5 ) 
AND categoryid IN ( 73 )
       AND approve = 1 
ORDER  BY fixed DESC, 
          date DESC 
LIMIT  0, 7; 

post_category 構造体

+-----+--------+------------+
| cid | postId | categoryId |
+-----+--------+------------+
| 824 |      7 |         10 |
| 825 |      7 |         13 |
| 826 |      7 |         16 |
| 827 |      7 |         29 |
| 828 |      7 |         71 |
+-----+--------+------------+
4

2 に答える 2

0

INTERSECT-compound ステートメントを使用できます。

SELECT postid
FROM post_category
WHERE categoryid = 73
INTERSECT
SELECT postid
FROM post_category
WHERE categoryid IN (130, 3, 4, 5)

これにより、等しい値と、少なくとも 1 つの= 、、、またはpostidを持つのみが選択されます。categoryid73categoryid130345

このクエリはおそらく集計クエリ ( GROUP BY) よりも高速に実行されます。これは、sql-server がcategoryid(できれば持っている) のインデックスを使用して関連する s を取得postidし、一時インデックスを使用して交差を計算できるためです (少なくともそれはsqlite はそうします)。postid73 を含む sがない場合categoryid、クエリの 2 番目の部分は実行されません。これは、空のセットと他のものとの共通部分が常に空のセットになるためです。

投稿を取得するには、サブクエリを使用します。

SELECT post.*
FROM post
WHERE post.id IN (SELECT postid
                  FROM post_category
                  WHERE categoryid = 73
                  INTERSECT
                  SELECT postid
                  FROM post_category
                  WHERE categoryid IN (130, 3, 4, 5))

また、必要に応じて - 化合物をさらに追加できることにも注意してくださいINTERSECT

于 2013-09-08T11:53:03.320 に答える