Frage

Dies ist eine sehr spezifische Frage bezüglich MySQL wie implementiert in WordPress.

Ich versuche, ein Plugin zu entwickeln, das (ausgewählte) Beiträge anzeigt, die bestimmte „Stichworte' und gehören zu bestimmten 'Kategorien' (beide mehrfach)

Mir wurde gesagt, dass dies aufgrund der Art und Weise, wie Kategorien und Tags gespeichert werden, unmöglich sei:

  1. wp_posts enthält eine Liste von Beiträgen, jeder Beitrag hat eine „ID“
  2. wp_terms enthält eine Liste von Begriffen (sowohl Kategorien als auch Tags).Jeder Begriff hat eine TERM_ID
  3. wp_term_taxonomy verfügt über eine Liste von Begriffen mit ihren TERM_IDs und über eine Taxonomiedefinition für jeden einzelnen Begriff (entweder eine Kategorie oder ein Tag).
  4. wp_term_relationships hat Assoziationen zwischen Begriffen und Beiträgen

Wie kann ich mich den Tabellen anschließen, um alle Beiträge mit dem Schlagwort „Nuklear“ zu erhalten? Und „Deals“, die auch zur Kategorie „Kategorie1“ gehören?

War es hilfreich?

Lösung

Ich habe dich missverstanden.Ich dachte, Sie wollten Nuklear oder Deals.Im Folgenden finden Sie nur Nuklear- und Deals-Angebote.

select p.*
from wp_posts p, wp_terms t, wp_term_taxonomy tt, wp_term_relationship tr,
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2

where p.id = tr.object_id and t.term_id = tt.term_id and tr.term_taxonomy_id = tt.term_taxonomy_id

and p.id = tr2.object_id and t2.term_id = tt2.term_id and tr2.term_taxonomy_id = tt2.term_taxonomy_id

and p.id = tr3.object_id and t3.term_id = tt3.term_id and tr3.term_taxonomy_id = tt3.term_taxonomy_id

and (tt.taxonomy = 'category' and tt.term_id = t.term_id and t.name = 'Category1')
and (tt2.taxonomy = 'post_tag' and tt2.term_id = t2.term_id and t2.name = 'Nuclear')
and (tt3.taxonomy = 'post_tag' and tt3.term_id = t3.term_id and t3.name = 'Deals')

Andere Tipps

Was für eine grobe DB-Struktur.

Wie auch immer, ich würde so etwas machen (beachten Sie, dass ich EXISTS den Joins vorziehe, aber Sie können sie auch als Joins umschreiben, wenn Sie möchten;Die meisten Abfrageanalysatoren reduzieren sie ohnehin auf denselben Abfrageplan.Möglicherweise müssen Sie auf die eine oder andere Weise zusätzlich jonglieren, damit es funktioniert ...

SELECT *
  FROM wp_posts p
 WHERE EXISTS( SELECT *
                 FROM wp_term_relationship tr
                WHERE tr.object_id = p.id
                  AND EXISTS( SELECT *
                                FROM wp_term_taxonomy tt
                               WHERE tt.term_taxonomy_id = tr.term_taxonomy_id
                                 AND tt.taxonomy         = 'category'
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Category1" 
                                           )
                            )
                  AND EXISTS( SELECT *
                                FROM wp_term_taxonomy tt
                               WHERE tt.term_taxonomy_id = tr.term_taxonomy_id
                                 AND tt.taxonomy         = 'post_tag'
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Nuclear" 
                                           )
                                 AND EXISTS( SELECT *
                                               FROM wp_terms t
                                              WHERE t.term_id = tt.term_id
                                                AND t.name    = "Deals" 
                                           )
                            )
            )

Also habe ich beide Optionen auf meiner WordPress-Datenbank ausprobiert.Ich habe in meinen Beiträgen nach der Kategorie „Tech“ mit den Tags „Perl“ UND „Programmierung“ gesucht.

Erics hat funktioniert, nachdem ich in der ersten Select-Anweisung ein fehlendes Komma hinzugefügt habe.Es wurden 3 Datensätze zurückgegeben.Das Problem besteht darin, dass der Abschnitt, der nach „post_tag“ sucht, tatsächlich als ODER-Option funktioniert.Einer meiner Beiträge hatte nur ein Tag, nicht beides.Es wäre auch gut, SELECT DISTINCT zu machen.

Ich habe es versucht Matts Version, aber es wurde immer wieder ein leerer Satz zurückgegeben.Vielleicht versuche ich damit zu „jonglieren“.

Versuche dies:

select p.*
from wp_posts p, 
wp_terms t, wp_term_taxonomy tt, wp_term_relationship tr
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship tr2

where p.id = tr.object_id
and t.term_id = tt.term_id
and tr.term_taxonomy_id = tt.term_taxonomy_id

and p.id = tr2.object_id
and t2.term_id = tt2.term_id
and tr2.term_taxonomy_id = tt2.term_taxonomy_id

and (tt.taxonomy = 'category' and tt.term_id = t.term_id and t.name = 'Category1')
and (tt2.taxonomy = 'post_tag' and tt2.term_id = t2.term_id and t2.name in ('Nuclear', 'Deals'))

Im Wesentlichen verwende ich zwei Kopien der relevanten untergeordneten Tabellen – terms, term_taxonomy und term_relationship.Eine Kopie wendet die Einschränkung „Kategorie 1“ an, die andere die Einschränkung „Nuklear“ oder „Deals“.

Übrigens, was ist das denn für ein Projekt mit Beiträgen rund um Atomabkommen?Versuchen Sie, uns auf eine Regierungsliste zu setzen?;)

Danke @Eric, es funktioniert!Nur ein paar Codekorrekturen zum späteren Nachschlagen:

  • Bei den ersten Select-Anweisungen fehlt nach wp_term_relationship tr2 ein Komma
  • In derselben Select-Anweisung muss Folgendes geändert werden:
wp_terms t2, wp_term_taxonomy tt2, wp_term_relationship 

tr2

sollte sein

wp_terms t3, wp_term_taxonomy tt3, wp_term_relationship 

tr3

Wirklich so tolle Antwort..Hat mir viel geholfen..

Großartig, weil es mir einen grundlegenden Ansatz für die Erstellung meiner komplexen Abfrage gegeben hat!

Eine kleine Korrektur für bereitwillige Benutzer wie mich :)

"wp_term_relationship" wird '' nicht existierer Fehler 'geben.verwenden wp_term_relations da es der korrekte Tabellenname ist.

Danke Eric

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top