2012-04-09 2 views
1

Я пытаюсь создать пользовательский запрос SELECT, чтобы найти мои личные лучшие расы из пользовательских типов WordPress, где время является настраиваемым мета-полем.Использование MIN в пользовательском запросе SELECT WordPress

Это вопрос, который я использовал для выбора сообщений. Я упростил для отладки, но в конце концов, я хочу, чтобы выбрать несколько долгосрочных слизней и найти MIN для каждого использования GROUP BY:

 SELECT  t.slug, 
        p.ID, 
        p.post_date, 
        p.post_title,      
        m.meta_value as pb_mins 
     FROM  $wpdb->posts p, 
        $wpdb->postmeta m, 
        $wpdb->term_relationships tr, 
        $wpdb->term_taxonomy tt, 
        $wpdb->terms t 
     WHERE  p.ID = tr.object_id 
       AND p.ID = m.post_id 
       AND tr.term_taxonomy_id = tt.term_taxonomy_id 
       AND tt.term_id = t.term_id 
       AND p.post_type = 'runs' 
       AND m.meta_key = 'ssr_duration_min' 
       AND t.slug in ('10mi') 

(я вывода результатов в массив и использовать print_r, чтобы проверить это временно .)

Это выбирает две гонки/пробежки с термином «10mi» и отображает правильные времена/дату/название для них.

Проблема возникает, когда я добавить MIN функцию:

 SELECT  t.slug, 
        p.ID, 
        p.post_date, 
        p.post_title,      
        MIN(m.meta_value) as pb_mins 

Правильное (минимальное) время выбран, но остальные детали (дата, название) являются с другой 10mi запуска/гонки.

Я попытался изменить положение FROM использовать LEFT JOIN а также INNER JOIN, но то же самое происходит: это хорошо для выбора трасс и «10mi», но дает неправильный вывод, когда я добавить функцию MIN.

Спасибо за любую помощь, которую вы можете предложить. Это мой первый пост, поэтому, пожалуйста, дайте мне знать, если мне нужно добавить какие-либо подробности.

+0

UPDATE: использование 'ORDER BY m.meta_value LIMIT 1' вместо' MIN' приводит к правильному результату, но я не знаю, как бы я экстраполировал его на более чем один термин slug без репликации запроса. Разумеется, это можно сделать с помощью 'MIN' и' GROUP BY'? – seestevecode

+0

Тогда вам понадобится запрос ['[наибольшая-n-группа]'] (http://stackoverflow.com/questions/tagged/greatest-n-per-group). –

+0

Благодарим вас за отзыв @ypercube. Это помогло мне найти решение, которое я разместил ниже. Боюсь, я не знаю, как списать вам больше с помощью, так как вы не опубликовали его в качестве ответа. Тем не менее, это очень ценно. – seestevecode

ответ

1

Я так и не смог опубликовать свое решение. Это было уже давно, поэтому я не могу полностью вспомнить, как я даже дошел до него (скорее всего, проб и ошибок), но если это кому-то поможет, они будут рады этому. Если я получу более подробную информацию, я добавлю их в качестве комментариев к этому ответу.

  SELECT  p1.ID, 
         m1.meta_value, 
         t1.name 
      FROM  $wpdb->posts p1, 
         $wpdb->postmeta m1, 
         $wpdb->term_relationships tr1, 
         $wpdb->term_taxonomy tt1, 
         $wpdb->terms t1, 
         ( SELECT  t2.slug as pb_distance, 
             MIN(m2.meta_value) as pb_duration 
          FROM  $wpdb->posts p2, 
             $wpdb->postmeta m2, 
             $wpdb->term_relationships tr2, 
             $wpdb->term_taxonomy tt2, 
             $wpdb->terms t2 
          WHERE  p2.ID = tr2.object_id 
            AND p2.ID = m2.post_id 
            AND tr2.term_taxonomy_id = tt2.term_taxonomy_id 
            AND tt2.term_id = t2.term_id 
            AND p2.post_type = 'runs' 
            AND p2.post_status = 'publish' 
            AND m2.meta_key = 'ssr_duration_min' 
            AND t2.slug IN $slugs 
          GROUP BY t2.slug) pb 
      WHERE  p1.ID = m1.post_id 
        AND p1.ID = tr1.object_id 
        AND tr1.term_taxonomy_id = tt1.term_taxonomy_id 
        AND tt1.term_id = t1.term_id 
        AND p1.post_type = 'runs' 
        AND p1.post_status = 'publish' 
        AND m1.meta_key = 'ssr_duration_min' 
        AND t1.slug in $slugs 
        AND m1.meta_value = pb.pb_duration 
      ORDER BY meta_value+0 
0

Другой вариант я использовал, который также работает в несколько иной запрос, заключается в следующем:

 SELECT  p.ID, 
        m.meta_value, 
        t.name 
     FROM  $wpdb->posts p, 
        $wpdb->postmeta m, 
        $wpdb->term_relationships tr, 
        $wpdb->term_taxonomy tt, 
        $wpdb->terms t 
     WHERE  p.ID = m.post_id 
       AND p.ID = tr.object_id 
       AND tr.term_taxonomy_id = tt.term_taxonomy_id 
       AND tt.term_id = t.term_id 
       AND p.post_type = 'runs' 
       AND p.post_status = 'publish' 
       AND m.meta_key = 'ssr_duration_min' 
       AND t.slug IN $slugs 
     ORDER BY meta_value+0 
     LIMIT  1 

В основном это заказы по стоимости и принимает только первый ответ, то есть. минимум.

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