sql >> データベース >  >> RDS >> Mysql

INを使用して複数のメタキー/値のペアに基づいてWP投稿を取得する

    post_metaに参加する必要があります テーブルを2回。ここにいくつかのデータベース理論があります。

    テーブルを結合すると、理論的には、一時テーブルに最初のテーブルのすべてのアイテムが含まれ、2番目のテーブルのすべてのアイテムが作成およびフィルタリングされます。たとえば、投稿ごとにメタアイテムが1つだけで、投稿が3つある場合は、

    +-------+----------+
    |post_id|post_title|
    +-------+----------+
    |   1   | 'Post 1' |
    |   2   | 'Post 2' |
    |   3   | 'Post 3' |
    +-------+----------+
    

    および

    +-------+----------+----------+------------+
    |meta_id| post_id  | meta_key | meta_value |
    +-------+----------+----------+------------+
    |   10  | 1        |  k1      | v1         |
    |   11  | 2        |  k1      | v2         |
    |   12  | 3        |  k1      | v3         |
    +-------+----------+----------+------------+
    

    そして、「理論上の」一時的な結合テーブルは次のとおりです。

    +---------+------------+----------+----------+-----------+-------------+
    |p.post_id|p.post_title|pm.meta_id|pm.post_id|pm.meta_key|pm.meta_value|
    +---------+------------+----------+----------+-----------+-------------+
    |   1     | 'Post 1'   |   10     | 1        |  k1       | v1          |
    |   1     | 'Post 1'   |   11     | 2        |  k1       | v2          |
    |   1     | 'Post 1'   |   12     | 3        |  k1       | v3          |
    |   2     | 'Post 2'   |   10     | 1        |  k1       | v1          |
    |   2     | 'Post 2'   |   11     | 2        |  k1       | v2          |
    |   2     | 'Post 2'   |   12     | 3        |  k1       | v3          |
    |   3     | 'Post 3'   |   10     | 1        |  k1       | v1          |
    |   3     | 'Post 3'   |   11     | 2        |  k1       | v2          |
    |   3     | 'Post 3'   |   12     | 3        |  k1       | v3          |
    +---------+------------+----------+----------+-----------+-------------+
    

    次に、次のように言います。WHERE p.id =pm.post_id

    これにより、一時テーブルが次のようにフィルタリングされます。

    +---------+------------+----------+----------+-----------+-------------+
    |p.post_id|p.post_title|pm.meta_id|pm.post_id|pm.meta_key|pm.meta_value|
    +---------+------------+----------+----------+-----------+-------------+
    |   1     | 'Post 1'   |   10     | 1        |  k1       | v1          |
    |   2     | 'Post 2'   |   11     | 2        |  k1       | v2          |
    |   3     | 'Post 3'   |   12     | 3        |  k1       | v3          |
    +---------+------------+----------+----------+-----------+-------------+
    

    したがって、投稿+メタ値ごとに1つの行しかありません。クエリは、meta_key = categoryの両方を持つ行を要求しています およびmeta_key=book_genre`は存在しません。

    したがって、postmetaを結合するテーブルが必要です TWICEのテーブル。

    これを行うには、テーブルを結合するときにテーブルのエイリアスを作成します。単純化することを許してください:

    SELECT wp_posts.*, pm1.*, pm2.*
    FROM
      wp_posts
      wp_postmeta as pm1
      wp_postmeta as pm2
    WHERE pm1.post_id = wp_posts.ID
      AND pm2.post_id = wp_posts.ID
      AND ...etc
    

    ここに、pm1にエイリアスされたpostmetaテーブルの2つの結合されたコピーがあります およびpm2 (両方をwp_postmetaと呼ぶことはできないため クエリで。

    次に、次のことを求めることができます:

    AND pm1.meta_key = 'category'
    AND pm1.meta_value = X
    AND pm2.meta_key = 'book_genre'
    AND pm2.meta_key IN (123,456)
    

    うまくいけば、そこから残りをつなぎ合わせることができます。

    また、そのルートに行きたい場合は、WP_Queryを使用してこれを行うことができると思います。




    1. テーブルの構造を変更せずに、テーブルの最後のn行を選択する最も効率的な方法は何ですか?

    2. MySQLで過去1か月のデータを取得する方法

    3. (Android)内部ストレージでパス/Androidを検索

    4. MariaDBのデータベースパフォーマンスチューニング