0

ワードプレスの投稿テーブルでいくつかの投稿を照会し、postmeta テーブルに複数回参加して複数のメタ値を取得しています。また、投稿列とメタ値の両方にいくつかの条件があります。クエリは機能しているようですが、条件を正しい場所に配置したかどうかに興味があります。次のクエリを比較すると、投稿 ID とそれに関連するメタを最も効果的/効率的に取得できるのはどれですか?

これです:

SELECT a.ID as `post_id`, b.meta_value as `metaval1`, c.meta_value as `metaval2`, d.meta_value as `metaval3`
FROM posts AS a
JOIN postmeta AS b ON (b.post_id = a.ID AND b.meta_key = 'metakey1')
LEFT JOIN postmeta as c ON (c.post_id = a.ID AND c.meta_key = 'metakey2')
LEFT JOIN postmeta as d ON (d.post_id = a.ID AND d.meta_key = 'metakey3')
WHERE
    b.meta_value != 10
    AND a.post_status = 'pending'
    AND a.post_date < '2013-03-07 00:00:00'
    AND a.post_type = "post"
ORDER BY a.post_date DESC
LIMIT 100;

またはこれ:

SELECT a.ID as `post_id`, b.meta_value as `metaval1`, c.meta_value as `metaval2`, d.meta_value as `metaval3`
FROM posts AS a
JOIN postmeta AS b ON (b.post_id = a.ID)
LEFT JOIN postmeta as c ON (c.post_id = a.ID)
LEFT JOIN postmeta as d ON (d.post_id = a.ID)
WHERE
    b.meta_key = 'metakey1'
    AND b.meta_value != 10
    AND c.meta_key = 'metakey2'
    AND d.meta_key = 'metakey3'
    AND a.post_status = 'pending'
    AND a.post_date < '2013-03-07 00:00:00'
    AND a.post_type = "post"
ORDER BY a.post_date DESC
LIMIT 100;

アドバイスをいただければ幸いです:)

4

1 に答える 1

0

2 つのクエリには違いがあります。

最初のクエリは、一致するメタキー値の数に関係なく、投稿の値を返します (少なくとも "b" 値が 10 でない投稿の場合)。on句で比較を行っているため、left joinは結果を処理します。

2 番目のクエリは、3 つのキーがすべて存在する場合にのみ値を返します。比較はwhere句内にあるため、によって生成された一致しない行はleft join除外されます。

どちらを好むかは、結果をどうしたいかによって異なります。どちらもほぼ同じ量の計算作業が必要です。

効率が必要な場合は、次のことも試してください。

SELECT p.id,
       max(case when pm.meta_key = 'metakey1' then pm.meta_value end) as metavalue1,
       max(case when pm.meta_key = 'metakey2' then pm.meta_value end) as metavalue2,
       max(case when pm.meta_key = 'metakey3' then pm.meta_value end) as metavalue3
FROM posts p join
     postmeta pm
     on pm.post_id = p.ID
WHERE pm.meta_key in ('metakey1', 'metakey2', 'metakey3') and
      (pm.meta_key <> 'metakey1' or pm.meta_value != 10) and
      p.post_status = 'pending' and
      p.post_date < '2013-03-07 00:00:00' and
      p.post_type = 'post'
group by p.post_date, p.id
ORDER BY p.post_date DESC
LIMIT 100;

これにより、集計を使用して結果をまとめ、結合の数を制限します。元のクエリは、結果をスキャンして実行するorder by必要があります。集計はほぼ同じ量の作業である必要がありますが、結合は少なくなります。

于 2013-03-22T20:15:44.393 に答える