2012-04-09 4 views
1

Ich versuche, eine benutzerdefinierte SELECT Abfrage zu finden, um meine persönlichen besten Rennen von WordPress Custom Types, wo die Zeiten sind eine benutzerdefinierte Meta-Feld.Verwenden von MIN in WordPress benutzerdefinierte SELECT-Abfrage

Dies ist die Abfrage, die ich verwendet habe, um die Beiträge auszuwählen. Ich habe es für die Fehlersuche vereinfacht, aber schließlich möchte ich mehrere Begriff Schnecken auszuwählen und die MIN für jede Verwendung GROUP BY zu finden:

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

(ich die Ergebnisse in ein Array ausgibt und mit print_r es vorübergehend zu überprüfen .)

Dies wählt die zwei Rennen/Läufe mit dem '10mi' Begriff aus und zeigt die richtigen Zeiten/Datum/Titel für sie an.

Das Problem kommt, wenn ich die MIN Funktion hinzufügen:

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

Die richtige (Minimum) Zeit gewählt ist, aber die anderen Details (Datum, Titel) von dem anderen 10mi run/Rennen.

Ich habe versucht, die FROM Klausel zu ändern LEFT JOIN zu verwenden und auch INNER JOIN aber das gleiche passiert: es ist in Ordnung für die Auswahl beiden Läufe ‚10mi‘, sondern gibt den falschen Ausgang, wenn ich die MIN Funktion hinzuzufügen.

Danke für jede Hilfe, die Sie anbieten können. Dies ist mein erster Beitrag hier also lass es mich wissen, wenn ich weitere Details hinzufügen muss.

+0

UPDATE: Die Verwendung von 'ORDER BY m.meta_value LIMIT 1' anstelle von' MIN' erzeugt das korrekte Ergebnis, aber ich weiß nicht, wie ich dies auf mehr als einen Term-Slug extrapolieren würde, ohne die Abfrage zu replizieren. Sicher muss es möglich sein, dies mit 'MIN' und' GROUP BY' zu tun? – seestevecode

+0

Dann brauchen Sie eine ['[greatest-n-per-group]'] (http://stackoverflow.com/questions/tagged/greatest-n-per-group) Abfrage. –

+0

Vielen Dank für den Tipp @ypercube. Es hat mir geholfen, die Lösung zu finden, die ich unten veröffentlicht habe. Ich fürchte, ich weiß nicht, wie ich Ihnen mit der Hilfe mehr Kredit geben soll, da Sie es nicht als Antwort gepostet haben. Es ist jedoch sehr geschätzt. – seestevecode

Antwort

1

Ich bin nie dazu gekommen, meine Lösung dafür zu posten. Es ist schon eine Weile her, also kann ich mich nicht mehr genau erinnern, wie ich überhaupt dazu gekommen bin (höchstwahrscheinlich Versuch und Irrtum), aber wenn das irgendjemandem hilft, sind sie willkommen. Wenn ich an weitere Details denke, füge ich sie als Kommentar zu dieser Antwort hinzu.

  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

Eine weitere Option, die ich verwendet habe, die auch für eine etwas andere Abfrage funktioniert, ist die folgende:

 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 

Diese grundsätzlich Aufträge durch den Wert und nimmt nur die erste Antwort, das heißt. das Minimum.