Einzelnen Beitrag anzeigen
  #1  
Alt 29.05.2009, 14:41:30
newgame newgame ist offline
Anfänger
 
Registriert seit: May 2009
Alter: 42
Beiträge: 2
Subquery Problem (Verständnis?)

hallo,
ich habe ein Problem mit einer mysql query in php genauer wordpress. Ich bin dabei eine Suchfunktion zu erstellen, die den Titel, das Exzerpt und die Tags eines posts nach den eingegeben keywords des users durchsucht und die ergebnisse nach Bewertung/Datum/Aufrufe/(Relevanz, aber im Moment scheint sich der Aufwand es hinzubiegen nicht zu lohnen) ordnen kann.

Posts nach Bewertung/Datum... zu ordnen stellt isoliert kein Problem dar. Ebenfalls funktioniert die Suche nach Stichworten auch, allerdings wieder isoliert. Das Problem entsteht wenn ich beides in einer mySQL-Query realisieren will (wenn es in mehreren ginge wäre es auch gut, aber ich kann mir nicht denken wie ich in php eine zweite Query auf die Ergebnisse der ersten anwenden kann).

Für mein Projekt war es sinnvoller tags als metakey eines jeden Posts zu integrieren statt das tagsystem von wordpress zu benutzen. Jedoch habe ich auch die Anzahl der Aufrufe eines Posts als Metakey gespeichert.
Code:
$total ="
          SELECT wposts.*
            FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta, $wpdb->term_relationships wcategory
            WHERE
            (   ( MATCH(wposts.post_title, wposts.post_excerpt) AGAINST ('".$keywords."' IN BOOLEAN MODE) )
            OR  ( wpostmeta.meta_value LIKE '%".$keywords."%' ) )
            AND wposts.ID = wpostmeta.post_id
            AND wposts.ID = wcategory.object_id AND wcategory.term_taxonomy_id = '21'
            AND wpostmeta.meta_key = 'tags'
            AND wposts.post_status = 'publish'
            AND wposts.post_type = 'post'
           
            ";
Das funktioniert zum Beispiel ganz gut. Aber hier ordne ich ja die Ergebnisse nach Aufrufen auch nicht. Das würde meiner Meinung nach auch nicht klappen, denn ich müsste irgendwie den metakey 'views' einbringen was alles zerstören würde, nämlich so
Code:
$total ="
          SELECT wposts.*
            FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta, $wpdb->term_relationships wcategory
            WHERE
            (   ( MATCH(wposts.post_title, wposts.post_excerpt) AGAINST ('".$keywords."' IN BOOLEAN MODE) )
            OR  ( wpostmeta.meta_value LIKE '%".$keywords."%' ) )
            AND wposts.ID = wpostmeta.post_id
            AND wposts.ID = wcategory.object_id AND wcategory.term_taxonomy_id = '21'
            AND wpostmeta.meta_key = 'tags'
            AND wposts.post_status = 'publish'
            AND wposts.post_type = 'post'
            AND wpostmeta.meta_key = 'views'
            ORDER BY CAST(wpostmeta.meta_value AS SIGNED) DESC
            ";
Irgendwie schließt es sich doch logisch aus und was soll jetzt meta_value sein. Man weiß es nicht.

Meine Lösungsstrategie war nun folgende (Monolog): " Ich muss es irgendwie schaffen mit einer SELECT Anweisung eine Tabelle anzufragen, die nur Zeilen enthält, die die Bedingung erfüllen in den entsprechenden Feldern die eingegebenen Suchworte des Users zu besitzen (
Code:
(   ( MATCH(wposts.post_title, wposts.post_excerpt) AGAINST ('".$keywords."' IN BOOLEAN MODE) )
            OR  ( wpostmeta.meta_value LIKE '%".$keywords."%' ) )
).
Und dann ordne ich mit einer weiteren SELECT Anweisung die Tabelle nach Aufrufen/Bewertung etc.
Aber wie soll das gehen? Sind Subqueries eine Lösung. Mal schauen"

Jedenfalls dachte ich, dass ich es mit subqueries schaffen werde. Aber NEIN! Irgendwie entstehen merkwürdige Fehler, die teilweise keine Fehlermeldung ausgeben (auch nicht in phpmyadmin) sondern entweder passiert nichts oder die Seite wird nur halb geladen, oder ich habe hundert Tausend Ergebnisse obwohl ich vielleicht nur 100 Datenbankeinträge habe.
Naja hier meine neue Query (eigentlich nicht mit allen features die ich haben will, aber es klappt ja so schon nicht)
Code:
$total ="
          SELECT wposts.*
            FROM $wpdb->postmeta wpostmeta, $wpdb->term_relationships wcategory,
              ( SELECT searchposts.*
                FROM $wpdb->posts searchposts, $wpdb->postmeta searchpostmeta
                WHERE
                ( (MATCH(searchposts.post_title, searchposts.post_excerpt) AGAINST ('".$keywords."' IN BOOLEAN MODE))
                  OR    (searchpostmeta.meta_value LIKE '%".$keywords."%')  )
                AND searchpostmeta.meta_key = 'tags' 
                AND searchposts.ID = searchpostmeta.post_id
                AND searchposts.post_status = 'publish'
                AND searchposts.post_type = 'post'
              ) AS wposts    
            "
Durch ergiebiges Rumprobieren glaube ich, dass das Problem an den mehreren Tabellenreferenzen Nach FROM liegt.
Das funktioniert zum Beispiel:
Code:
SELECT wposts.*
            FROM
              ( SELECT searchposts.*
                FROM wp_posts searchposts
                WHERE searchposts.post_status = 'publish'
                AND searchposts.post_type = 'post'
              ) AS wposts
Also Leute, ich hoffe ihr versteht mein Problem und könnt mir helfen.

Anm: Hier die Datenbanken von Wordpress http://codex.wordpress.org/Database_Description
Mit Zitat antworten