2010-10-08 5 views
1

J'ai une requête pour tirer tous les articles de la base de données ..Requête PHP/MySQL Dans une boucle, comment ajouter une seule requête?

$get_articles = $db->query(" 
    SELECT *, a.id AS id, s.type AS type FROM ".$prefix."articles a 
    LEFT JOIN ".$prefix."sources s ON (s.id = source_id) 
    WHERE a.type!='trashed' ORDER BY a.timestamp DESC LIMIT $start, $end"); 

Dans la boucle de cette requête, je ne puis faire une autre requête sur la même table pour trouver des articles liés au « titre » de l'article, stocké sous la forme '$ related_phrase'. La requête dans la boucle est:

// get related articles to this entry 
$get_related = $db->query(" 
    SELECT *, a.id AS id, MATCH (title, description) AGAINST ('$related_phrase') AS score FROM ".$prefix."articles a 
    LEFT JOIN ".$prefix."sources s ON (s.id = source_id) WHERE a.type!='trashed' AND MATCH (title, description) AGAINST ('$related_phrase') AND a.id!='$articles[id]' HAVING score > 7 
    ORDER BY a.timestamp DESC LIMIT 0, 3"); 

Cela signifie fondamentalement que nous avons une requête dans une boucle qui provoque le chargement des pages très lentement.

Ce que nous voulons faire, est d'amener la requête depuis la boucle, dans la requête principale, de sorte que tout fonctionne dans une requête, si c'est possible?

Toute aide très appréciée!

Répondre

0

Je ne pense pas que vous gagneriez beaucoup de vitesse en fusionnant les deux requêtes. Une chose que vous pouvez essayer est d'obtenir une liste de tous les articles et des expressions de recherche DISTINCT (par exemple, tenttable), puis de générer une requête pour obtenir tous les articles connexes en un seul passage. Enfin faire correspondre les articles connexes avec la liste des articles.

0

essayez ceci:

$articles_and_related = $db->query(" 
    SELECT * 
    FROM ".$prefix."articles art 
    LEFT JOIN (
       SELECT * FROM ".$prefix."articles x 
       WHERE 
       score > 7 
       AND x.type != 'trashed' 
       AND x.id != art.id 
       AND MATCH(x.title, x.description) AGAINST (art.title) 
       LIMIT 3 
    ) rel 
    LEFT JOIN ".$prefix."sources s2 ON (s2.id = rel.source_id) 
    LEFT JOIN ".$prefix."sources s ON (s.id = art.source_id) 
    WHERE 
     art.type!='trashed' 
    ORDER BY art.timestamp DESC LIMIT $start, $end"); 
Questions connexes