2012-05-03 5 views
0

У меня есть следующий запрос, который не возвращает результаты:MYSQL Query же поле дважды

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).

Может ли кто-нибудь указать мне правильное направление?

ответ

1

Конечно, не исключено, что один столбец принимать два Differents значения в то время:

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

Jonathan , Я не знаю вашего ожидаемого результата, потому что вы говорите об одном скалярном результате (номер 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 
+0

но как получить доступ к значению для NumPrizes? Я хочу вывести общее количество призов, но я не могу этого сделать с помощью вашего кода ... – Sweepster

+0

+1 просто для того, чтобы тратить время, чтобы написать этот чрезвычайно длинный и подробный запрос для него! Браво! :) –

Смежные вопросы