2009-06-02 9 views
1

So funktioniert es
Ich verwende Wordpress-Kategorie Tabellen und haben 2 Hauptkategorien. Der erste heißt "location" und der andere "subject". Beide Kategorien haben eigene Unterkategorien.Wordpress erweiterte SQL - verbindet und zählt

In meinem Beispiel haben wir „location“ Kategorie 17 und „subject“ Kategorie 3.

Dies ist, was ich tun will
ich nur die Daten auswählen möchten, wo beide meine Kategorien 17 und 3 werden vorgestellt.

Dieser Code funktioniert bisher

SELECT term_id, post_title, post_name, ID, object_id, post_status 
FROM wp_posts AS wpost 
INNER JOIN wp_term_relationships 
    ON wpost.ID = wp_term_relationships.object_id 

INNER JOIN wp_term_taxonomy 
    ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category' 

WHERE wp_term_taxonomy.term_id IN (17, 3) 
    AND post_status = 'publish' 

Das Problem
Beide Kategorien 17 und 3 in der gleichen Spalte vorhanden ist. Der obige Code listet die IDs zweimal auf, wenn die Posts in beiden Kategorien angezeigt werden.

Gibt es eine Möglichkeit, die IDs zu zählen, die im Ergebnis gleich sind? Wenn ID zweimal vorhanden ist, wählen Sie den Post aus dieser ID aus. nur einmal

Antwort

1

Dies wird jeden Beitrag wählen, wenn es in beiden Kategorien besteht:

SELECT post_title, post_name, post_status 
FROM wp_posts AS wpost 
WHERE post_status = 'publish' 
     AND EXISTS (
     SELECT 1 
     FROM  wp_term_relationships 
     INNER JOIN 
       wp_term_taxonomy 
     ON  wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id 
       AND wp_term_taxonomy.taxonomy = 'category' 
       AND wp_term_taxonomy.term_id IN (17, 3) 
     WHERE wp_term_relationships.object_id = wpost.ID 
     LIMIT 1, 1 
     ) 
+0

Es funktioniert nicht. Wenn ich die Zeile mit INNER JOIN lösche gibt es mir zumindest keine Fehler, aber es zeigt mir Zeilen in 17 ODER 3. Ich brauche es innerhalb von 17 UND 3. –

+0

Es funktioniert jetzt wie ein Zauber, nachdem du den Beitrag bearbeitet hast . Danke, habe meinen Tag gerettet! –

0

Dies würde es tun (vorausgesetzt, es gibt keine doppelten Zeilen für einen Eintrag in der Kategorie ist 3 oder 17) ohne die Notwendigkeit für eine verschachtelte Abfrage:

SELECT term_id, post_title, post_name, ID, object_id, post_status, COUNT(*) as count 
FROM wp_posts AS wpost 
INNER JOIN wp_term_relationships 
    ON wpost.ID = wp_term_relationships.object_id 

INNER JOIN wp_term_taxonomy 
    ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category' 

WHERE wp_term_taxonomy.term_id IN (17, 3) 
    AND post_status = 'publish' 
    AND count = 2 

GROUP BY ID 

die count variable and the GROUP BY clause Hinzufügen Duplikate verklumpen. Sie filtern dann nach Zeilen, deren Anzahl gleich 2 ist, um die Einträge in beiden Kategorien zu erhalten.

+0

Die Idee ist großartig, funktioniert aber nicht. Es gibt mir ein leeres Ergebnis. –

+0

Derselbe Kommentar wie das, was ich in den nächsten Beitrag geschrieben habe: "AND count = 2" funktioniert nicht, weil die Anzahl nicht existiert, bis die Zeilen zurückgegeben werden. Ich würde auch empfehlen, count in '' weil es ein reserviertes Wort ist. Was Sie brauchen, ist "HAVING' count' = 2 "oder" HAVING count (*) = 2 ". –

0

Ein Schritt näher? Jetzt muss ich nur noch die Zeilen anzeigen, die "2" in der Spalte "count" enthalten.

Da die Zählspalte innerhalb der "Schleife" erstellt wird, ist es nicht möglich, nur "AND count = 2" zu schreiben.

Dieses Beispiel zeigt das Ergebnis einschließlich der Zählspalte:

SELECT term_id, post_title, post_name, ID, object_id, post_status, COUNT(ID) as count 
FROM wp_posts AS wpost 
INNER JOIN wp_term_relationships 
    ON wpost.ID = wp_term_relationships.object_id 

INNER JOIN wp_term_taxonomy 
    ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category' 

WHERE wp_term_taxonomy.term_id IN (17, 3) 
    AND post_status = 'publish' 

GROUP BY ID 
+0

"AND count = 2" funktioniert nicht, da Anzahl nicht vorhanden ist, bis die Zeilen zurückgegeben werden. Ich würde auch empfehlen, count in '' weil es ein reserviertes Wort ist. Was Sie brauchen, ist "HAVING' count' = 2 "oder" HAVING count (*) = 2 ". –

+0

@Jens: Sie könnten einfach HAVING COUNT (*) = 2 in Ihre Abfrage einfügen, aber es ist besser, EXISTS mit LIMIT 1, 1 zu verwenden. GROUP BY ist schlechter für die Leistung. – Quassnoi