2012-04-03 7 views
0

Ich habe eine Abfrage zu wählen Beiträge (wp_posts table), wo entweder 1 Schlüssel/Wert-Paar oder ein anderes ist auf der Sekunde vorhanden Tabelle (wp_postmeta). Im Prinzip funktioniert das, aber ich muss dann die Ergebnisse nach dem ersten Schlüssel/Paar-Wert() und dann nach dem zweiten (staff_surname) ordnen.Reihenfolge Abfrage von zwei Schlüssel/Wert-Paare, wo die Felder für die Schlüssel/Wert-Paare sind die gleichen

Das Problem ist, wegen der Art und Weise, wie die Ergebnisse von der Abfrage ergriffen werden, gibt es keinen department_head Schlüssel zu verwenden, um die Ergebnisse zu bestellen. Ich vermute, dass dies daran liegt, dass die Abfrage zuerst den Schlüssel staff_surname findet?

Erneut Raten, aber wenn meine obige Vermutung richtig ist, dann ist es, weil, obwohl ich die Tabelle zweimal beitreten, MYSQL nur die erste Instanz aus der wp_postmeta Tabelle ergreift, wenn die staff_surname Bedingung erfüllt ist. Dies ist es, was ich brauche, um herum zu finden, damit ich die richtigen Daten habe, um die Ergebnisse bestellen zu können.

Voll Abfrage -

SELECT SQL_CALC_FOUND_ROWS wp_posts.* 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
WHERE 1=1 
AND (
    wp_term_relationships.term_taxonomy_id IN (34) 
) 
AND wp_posts.post_type = 'people' 
AND (
    wp_posts.post_status = 'publish' 
    OR wp_posts.post_status = 'private' 
) 
AND (
    (
     wp_postmeta.meta_key = 'department_head' 
     AND CAST(wp_postmeta.meta_value AS CHAR) = 'private-client' 
    ) 
    OR (
     mt1.meta_key = 'staff_surname' 
     AND CAST(mt1.meta_value AS CHAR) != '' 
    ) 
) 
GROUP BY wp_posts.ID 
ORDER BY mt1.meta_value ASC 
LIMIT 0, 10 

Beispiel von Abfrageergebnissen -

ID name meta_id post_id meta_key meta_value meta_id post_id meta_key  meta_value 

1 Test1 10  1  random_key random_value 11  1  staff_surname Smith 
2 Test1 20  2  random_key random_value 21  2  staff_surname Jones 
3 Test1 30  3  random_key random_value 31  3  staff_surname Harris 

Beispiel dessen, was ich verlangen, wenn Jones war der Abteilungsleiter -

ID name meta_id post_id meta_key   meta_value  meta_id post_id meta_key  meta_value 

1 Test1 10  1          11  1  staff_surname Smith 
2 Test1 22  2  department_head private-client 21  2  staff_surname Jones 
3 Test1 30  3          31  3  staff_surname Harris 

Die 'department_head' Schlüssel existiert in der überwiegenden Mehrheit der Fälle nicht, deshalb ist der Schlüssel/Wert in den anderen Fällen leer.

Gibt es eine Möglichkeit, die von mir benötigten Bestellergebnisse zu erzielen?

Hinweis: Der Grund, dass ich hier im Gegensatz zu der Wordpress-Website geschrieben habe, ist, weil dies eine benutzerdefinierte Abfrage ist, nicht WP generiert, so wird es wahrscheinlich außerhalb des Umfangs der meisten WP-Experten sein.

Antwort

1

Ich bin mir nicht sicher, aber ich werde versuchen, dies mit einigen LINKEN JOINS zu erreichen und die Bedingungen an die JOINS zu verschieben, um die Abfrage effizienter zu machen.

Etwas Ähnliches kann dies ... arbeiten

SELECT p.* 
FROM wp_posts p 
INNER JOIN wp_term_relationships r ON 
    (p.ID=r.object_id AND r.term_taxonomy_id=34) 
LEFT JOIN wp_postmeta m1 ON 
    (p.ID=m1.post_id AND m1.meta_key='department_head' AND CAST(m1.meta_value AS CHAR)='private-client') 
LEFT JOIN wp_postmeta m2 ON 
    (p.ID=m2.post_id AND m2.meta_key = 'staff_surname' AND CAST(m2.meta_value AS CHAR) != '') 
WHERE 
    p.post_type = 'people' 
    AND 
    (p.post_status = 'publish' OR p.post_status = 'private') 
GROUP BY p.ID 
ORDER BY m1.meta_value DESC, m2.meta_value DESC 
LIMIT 0, 10 
+0

Wie auf der Erde Sie gezogen, dass man aus dem Sack, werde ich nie wissen! Funktioniert wie ein Zauber, achtet genau auf das, was ich brauchte, und ich fand heraus, dass ich diese Abfrage mit WP-Filtern durchführen konnte, so dass viel weniger Code benötigt wurde. Die einzige sehr kleine Änderung war, dass ich "m1.meta_value ASC" in "DESC" ändern musste. Vielen Dank für deine Hilfe. –

+0

Perfekt, ich hatte Glück ... :-) – jordeu

+0

Ich habe ASC auf DESC in der Antwort bearbeitet und geändert – jordeu

Verwandte Themen