Lanz fragt: MYSQL Wordpress Meta Daten Analyse

Hallo,

vorweg bitte keine Diskussionen über Wordpress oder ein anderes CMS, Danke.

Nun zu meiner Frage: Wordpress nutzt eine sog. "post_meta" mysql Tabelle um benutzerdefinierte Inhalte zu speichern.

Spalte 1 "meta_id" ist eine fortlaufende ID
Spalte 2 "post_id" enthält die ID des Artikels dem Sie zugewiesen ist
Spalte 3 "meta_key" Enthält den Schlüssel (benutzerdefinierten Felder)
Spalte 4 "meta_value" Enthält dann den zugewiesenen Wert

Ich möchte nun alle Artikel bei denen im "meta_key" -> "_kksr_avg" der "meta_value" = 5 ist, UND bei der gleichen "post_id" muss auch der "meta_key" -> "_kksr_casts" den "meta_value" (gleich größer) 2 sein.

Jetzt könnte man einfach zwei MYSQL Abfragen hintereinander setzten:

SELECT *  FROM `wp_postmeta` WHERE `meta_key` LIKE '_kksr_avg' AND `meta_value` = '5.00'
SELECT *  FROM `wp_postmeta` WHERE `meta_key` LIKE '_kksr_casts' AND `meta_value` >= '2'

beides in ein Arry setzen und dann vergleichen. Unschön Join ist auch eher für zwei verschiedene Tabellen gedacht, und Group by!?!?

Wie würdet Ihr das Problem lösen? Danke für eure Denkanstöße

akzeptierte Antworten

  1. Natürlich kannst Du diese Tabellen joinen. Machs doch einfach. MFG

    1. Äh und wie soll das funktionieren?

      SELECT *  FROM `wp_postmeta` JOIN `wp_postmeta` WHERE post_id = post_id AND `meta_key` LIKE '_kksr_avg' AND `meta_value` = '5.00' AND `meta_key` LIKE '_kksr_casts' AND `meta_value` >= '2'
      

      kann ja nicht funktionieren!?! ?

      1. Tach!

        Äh und wie soll das funktionieren?

        SELECT *  
        FROM `wp_postmeta` 
          JOIN `wp_postmeta` 
        WHERE post_id = post_id AND 
          `meta_key` LIKE '_kksr_avg' AND
          `meta_value` = '5.00' AND
          `meta_key` LIKE '_kksr_casts' AND
          `meta_value` >= '2'
        

        kann ja nicht funktionieren!?! ?

        Natürlich nicht, weil so nicht klar wird, aus welcher Tabelle das Datenfeld verwendet werden soll. Das wird mit zwei Aliasen eindeutig.

        LIKE ist auch nicht der passende Operator für Stringvergleiche, wenn keine variablen Anteile zu suchen sind. Nimm für feststehende Werte auch das =.

        dedlfix.

      2. Hast Du Dir mal die JOIN-Syntax angeschaut? Da gibt es z.B. eine Funktion USING(key) wenn key der Name des Schlüssel ist welcher die Daten einer Detailtabelle referenziert. Einen solchen Schlüssel also brauchst Du und wenn die Namen nicht gleichlautend sind, dann notiere JOIN detail ON basekey = detailkey; Viel Erfolg!

  2. Tach!

    Jetzt könnte man einfach zwei MYSQL Abfragen hintereinander setzten:

    SELECT *  FROM `wp_postmeta` WHERE `meta_key` LIKE '_kksr_avg' AND `meta_value` = '5.00'
    SELECT *  FROM `wp_postmeta` WHERE `meta_key` LIKE '_kksr_casts' AND `meta_value` >= '2'
    

    beides in ein Arry setzen und dann vergleichen. Unschön Join ist auch eher für zwei verschiedene Tabellen gedacht, und Group by!?!?

    Wie würdet Ihr das Problem lösen?

    Dein eigentliches Ziel sind doch sicher nicht die Metadaten sondern die Artikel. Wenn ja, würde ich von der Tabelle wp_posts ausgehen und dazu die Bedingungen formulieren. Joins sind auch eher unschön, weil sie ein kartesiches Produkt (zumindest als Zwischenschritt) erzeugen, was hier aber nicht das Ziel ist. Deshalb plädiere ich für EXISTS-Subquerys.

    SELECT ... FROM wp_posts p 
    WHERE 
      EXISTS(SELECT * FROM wp_postmeta WHERE post_id = p.ID AND ...) AND 
      EXISTS(SELECT * FROM wp_postmeta WHERE post_id = p.ID AND ...)
    

    Ich finde auch, die Abfrage so gestellt, zeigt gleich, was man eigentlich möchte. Ein Join hingegen ist eigentlich ein Umweg aus technischen Gründen.

    Wenn du allerdings die Daten von wp_postmeta in der Ergebnismenge brauchst, müsste wohl doch ein Join her.

    dedlfix.

    1. Äh vielen, vielen Dank. Du hast mein Problem perfekt erkannt und erfasst.