0

結果を返さない次のクエリがあります。

1. SELECT *
2. FROM wp_postmeta pm
3. LEFT JOIN wp_posts p ON (p.ID = pm.post_id)
4. LEFT JOIN wp_term_relationships tr ON (p.ID = tr.object_id)
5. LEFT JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
6. WHERE p.post_status = 'publish' 
7. AND p.post_type = 'post' 
8. AND p.post_date < NOW()+INTERVAL 1 DAY 
9. AND tt.taxonomy = 'category' 
10. AND tt.term_id IN(3)
11. AND (pm.meta_key = 'EndDate' AND pm.meta_value > DATE_ADD(NOW(), INTERVAL 3 HOUR)) 
12. AND (pm.meta_key = 'NumPrizes' AND pm.meta_value > 1)
13. GROUP BY ID
14. ORDER BY p.ID DESC

この問題は、行 11 と行 12 が原因で発生します。どちらか一方を削除して結果を得ることができますが、必要なものを得るには両方が必要です。

私が望むのは、pm.meta_key EndDate が今日より大きく、かつ pm.meta_key NumPrizes が 0 より大きい結果を取得することです。

アイデアは、データベース内の賞品の総数を出力することです。

データベースはwordpressで構築されているため、変更することはできません。これが機能する方法は、meta_key にはフィールドの名前である値があり、meta_value は meta_key の実際の値です。

wp_postmeta テーブルの例:

meta_id     post_id    meta_key   meta_value
1           45         EndDate    2012-01-01    <- too old
2           45         NumPrizes  5             <- since too old, don't count
3           76         EndDate    2012-07-03    <- valid date but...
4           76         NumPrizes  1             <- only 1 prize so don't count
5           90         EndDate    2012-06-02    <- valid date and
6           90         NumPrizes  4             <- more than one prize so count it
7           192        EndDate    2012-09-01    <- valid date and
8           192        NumPrizes  9             <- more than one prize so count it

予想される出力: 賞品の数は 13 (4+9 = 13) です。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

1

もちろん、1 つの列が一度に 2 つの異なる値を取ることはできません。

11. AND pm.meta_key = 'EndDate'      <<-- big error: column can't take two
12. AND pm.meta_key = 'NumPrizes'    <<--      differents values at a time

テーブルを正規化するか、適切なクエリを作成する必要があります。

1. SELECT *
2. FROM wp_postmeta pm
3. LEFT JOIN wp_posts p ON (p.ID = pm.post_id)
4. LEFT JOIN wp_term_relationships tr ON (p.ID = tr.object_id)
5. LEFT JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
6. WHERE p.post_status = 'publish' 
7. AND p.post_type = 'post' 
8. AND p.post_date < NOW()+INTERVAL 1 DAY 
9. AND tt.taxonomy = 'category' 
10. AND tt.term_id IN(3)
11. AND (pm.meta_key = 'EndDate' AND pm.meta_value > DATE_ADD(NOW(), INTERVAL 3 HOUR)) 
12. AND exists (
          select 1 from wp_postmeta pm2 where
          pm2.post_id  = pm.post_id and
          pm2.meta_key = 'NumPrizes' AND pm2.meta_value > 1
    )
13. GROUP BY ID
14. ORDER BY p.ID DESC

編集済み

ジョナサン、質問では単一のスカラー結果(13番)について話しているが、クエリではメインテーブルを他のテーブルと結合しているため、あなたの予想される結果はわかりません。ここに書いたコードがお役に立てば幸いですが、特定のケースに合わせて調整する必要があります。

1. SELECT *, sum( __your_prizes_agrregation__ )
2. FROM wp_postmeta pm
3. LEFT JOIN wp_posts p ON (p.ID = pm.post_id)
4. LEFT JOIN wp_term_relationships tr ON (p.ID = tr.object_id)
5. LEFT JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
6. WHERE p.post_status = 'publish' 
7. AND p.post_type = 'post' 
8. AND p.post_date < NOW()+INTERVAL 1 DAY 
9. AND tt.taxonomy = 'category' 
10. AND tt.term_id IN(3)
11. AND exists (
          select 1 from wp_postmeta pm2 where
          pm2.post_id  = pm.post_id and
          pm2.meta_key = 'EndDate' AND 
          pm2.meta_value > DATE_ADD(NOW(), INTERVAL 3 HOUR)
    )
12. AND exists (
          select 1 from wp_postmeta pm2 where
          pm2.post_id  = pm.post_id and
          pm2.meta_key = 'NumPrizes' AND pm2.meta_value > 1
    )
13. GROUP BY ID
14. ORDER BY p.ID DESC
于 2012-05-03T19:13:03.447 に答える