PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQL/MySQLi (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   Subquery Problem (Verständnis?) (http://www.selfphp.de/forum/showthread.php?t=21552)

newgame 29.05.2009 14:41:30

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

newgame 29.05.2009 23:01:27

AW: Subquery Problem (Verständnis?)
 
Durch genaues analysieren eines mysql artikels bin ich auf die Lösung gekommen

Falls es wen interessiert:
Code:

$total ="
                        SELECT wposts.*
            FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
            WHERE wposts.ID = wpostmeta.post_id
            AND wpostmeta.meta_key = '_views'
            AND wposts.post_status = 'publish'
            AND wposts.post_type = 'post'
            AND wposts.ID = ANY (
                    SELECT wposts.ID
                FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
                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 wpostmeta.meta_key = 'tags'
                AND wposts.post_status = 'publish'
                AND wposts.post_type = 'post'
            )
            ORDER BY CAST(wpostmeta.meta_value AS SIGNED) ASC
            ";



Alle Zeitangaben in WEZ +2. Es ist jetzt 01:05:08 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.