2012-05-03 8 views
0

Iの結果を返しません。次のクエリがありますMYSQLクエリと同じフィールド二回

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の終了日は、今日よりも大きく、どこ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)です。

誰でも正しい方向に向けることができますか?もちろん

答えて

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 

EDITED

ジョナサン質問ではスカラー結果(番号13)は1つだと言いますが、クエリではメインテーブルを他のテーブルと結合するので、あなたの疑わしい結果はわかりません。私がここに書いているこのコードがあなたに役立つことを願っていますが、それをあなたの特定のケースに合わせるべきです。

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 
+0

しかし、私はNumPrizesの値にどのようにアクセスしますか?私は賞品の合計数を出力したいが、私はあなたのコードを使用してそれを行うことはできません... – Sweepster

+0

+1彼はこの非常に長く冗長なクエリを書くために時間を割いて+1!ブラボー! :) –

関連する問題