Page 1 sur 1
Afficher les résultats de 2 requêtes dans une seule boucle
Posté : 22 janv. 2006, 00:01
par mistral
Bonjour,
Je souhaiterais en fait afficher simultanément les résultats de deux requêtes SQL dans une boucle. Je m'explique : dans une table_1, je cherche les enregistrements tels que titre='X' et dans une table_2, je cherche les enregistrements tels que contenu='X'. Comment faire pour afficher les résultats correspondants aux deux recherches dans une même boucle ?
Je précise au passage que pour la table_2, je dois utiliser un JOIN afin d'afficher le titre (table_1) correspondant au contenu (table_2).
Merci d'avance à celui qui pourra m'aider.
Posté : 22 janv. 2006, 00:09
par Truc
Salut, as tu déjà une requete de faite ?
Si non, il serai interéssant de voir la structure des tables et nottament les champs qui seront utilisées.
si tu utilise un JOIN l'affichage dans une seule boucle ne sera pas plus difficile que sans.
Posté : 22 janv. 2006, 01:14
par mistral
Salut et merci pour ta réponse.
Bon alors pour être plus clair, voici le code
[$sql = "SELECT titre, id FROM table_1 LEFT JOIN contenu ON table_1.id = table2.tit_id WHERE LIKE '%$X%'";
for($j = 1; $j < count($tab); $j++)
{
$sql .= " ".$op." post LIKE '%$X%'";
}
if(strlen($X) > 1)
{
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$nb = mysql_num_rows($req);
while ($i = mysql_fetch_array($req))
{
echo "".$i['titre']."</a> ";
}/
Il y a donc deux tables, et le contexte est celui d'un forum. table_1 contient les noms des posts avec un ID pour simplifier et table_2 correspond à la table des posts, et contient l'ID de son post père. Il s'agit dans le cadre de ce script de rechercher tous les posts contenant le mot clé designé par la variable '$X' et d'afficher donc leur titre. C'est chose faite avec le script ci dessus. Mais j'aimerais également pouvoir rechercher dans la table des titres, voir s'il n'y en a pas qui contiennent également '$X' et afficher le cas échéant les correspondances supplémentaires dans le cadre de la boucle while. C'est à dire que j'aimerais que la liste établie par le script précédent soit complétée par les topics dont le titre contient '$X' (et si possible en évitant les doublons par rapport aux résultats déjà affichés).
D'avance merci

[/code]
Posté : 22 janv. 2006, 01:17
par mistral
Désolé, je reprends le code qui est mal passé :s
<?$sql = "SELECT titre, id FROM table_1 LEFT JOIN contenu ON table_1.id = table2.tit_id WHERE contenu LIKE '%$X%'";
for($j = 1; $j < count($tab); $j++)
{
$sql .= " ".$op." post LIKE '%$X%'";
}
if(strlen($X) > 1)
{
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$nb = mysql_num_rows($req);
while ($i = mysql_fetch_array($req))
{
echo "".$i['titre']."</a> ";
}
?>
Posté : 22 janv. 2006, 01:59
par Truc
a quoi correspond la boucle for() ?
je pense que l'effet de cette boucle n'est pas celui recherché.
S'il y a 2 passages (2 valeurs dans $tab) alors la requete va donner:
(...)WHERE contenu LIKE '%$X%' AND post LIKE '%$X%' AND post LIKE '%$X%'
donc toujours les mêmes valeurs.
Mais d'après ce que j'ai compris cette requete devrait faire l'affaire avec un test:
if(condition)
$sql .= " ".$op." post LIKE '%$X%'";
donc une seule fois
et l'affichage du titre fonctionne ?
Enfaite la question (le problème) n'est pas très claire
Posté : 22 janv. 2006, 02:16
par mistral
Merci de ton aide, mais en fait c'était pas vraiment ça que j'essayais de demander.
En fait, les titres s'affichent sans problème avec la requête que j'ai donné plus haut. Mais ce que je voudrais, c'est une deuxième requête qui recherche directement dans la table_1 les titres LIKE '$X' . (Actuellement, avec le code précédement cité, on recherche dans la table_2 les posts LIKE '$X' et on affiche le titre qui leur correspond). Et pour la requête dans table_1, il faudrait éventuellement éviter les doublons par rapport à l'autre requête... (mais c'est secondaire)
Et pour ces deux requêtes, j'aimerais afficher un seul et même tableau de résultats.
merci pour votre aide
Posté : 22 janv. 2006, 02:31
par Truc
proposition:
$sql = "SELECT titre, id FROM table_1 LEFT JOIN contenu ON table_1.id = table2.tit_id WHERE table2.contenu LIKE '%$X%' OR table_1.titre LIKE '%$X%'";
basé sur le même principe, ou alors je suis encore à coté de la plaque

Posté : 22 janv. 2006, 15:04
par mistral
Oui, merci, ça à l'air de marcher !!! il me reste encore un champs à rajouter, mais j'ai compris le principe.
Sinon pour en revenir à la boucle For, si elle a une utilité, car je n'avais pas précisé en fait que le fameux '$X' représente donc un texte de recherche qui est scindé en fonction des espaces avec la fonction explode. Donc il s'agit bien d'un tableau... par contre, il faudrait que je rajoute aussi cette boucle pour la recherche dans les titres... Ca ne risque pas de faire trop lourd comme requête ?
Posté : 22 janv. 2006, 15:26
par Truc
Ok pour la boucle mais est tu sûr qu'elle fonctionne ?
Il n'y a pas de paramètre qui vari dans la boucle
si $tab contient les mot sous forme de tableau, la boucle devrait ressembler à ceci:
for($j = 1; $j < count($tab); $j++)
{
$sql .= " ".$op." post LIKE '%$tab[$i]%'";
}
Mais en effet suivant le nombre de mots la requete sera assez importante. On peut donc remplacer les appels à "LIKE" par "REGEXP" et donc travailler avec une expression régulière.
Regarde
ici pour un exemple qui correspond exactementà ton problème.
Posté : 22 janv. 2006, 16:09
par mistral
Oui, la boucle est bien telle que tu l'as écrite (sauf que c'est "j" le compteur ^^)
Ok, donc je vais distiguer 3 cas :
=> Expression exacte exacte => avec titre LIKE '%requete complete%' OR contenu LIKE '%requête complete%'
=> Au moins un mot => avec titre LIKE '%REGEXP(requete|complete)%' OR contenu LIKE '%REGEXP(requete|complete)%'
=> Tous les mots => (je ne vois pas comment faire, donc en conservant la boucle) avec titre LIKE '%requete%' AND titre LIKE '%complete%' OR contenu LIKE '%requete%' OR LIKE '%complete%' (mais c'est lourd)
Ca irait comme ça ??? (je suppose qu'il faut quand même un LIKE avant REGEXP puisque ce n'est pas forcément l'occurence exacte, il peut y avoir du texte avant et après à chaque fois.)
Merci bcp pour ton aide.
Posté : 22 janv. 2006, 22:24
par Truc
non une seule requete suffit:
$chaine="mot recherche regexp"
$chaine=str_replace(" ","|",$chaine); //remplace les espaces par des | qui signifient "ou" pour une expression régulière => $chaine="mot|recherche|regexp"
$sql = "SELECT titre, id FROM table_1 LEFT JOIN contenu ON table_1.id = table2.tit_id WHERE table2.contenu REGEXP '(".$chaine.")' OR table_1.titre REGEXP '(".$chaine.")'";
Posté : 22 janv. 2006, 22:35
par Hubert Roksor
Au fait mistral, tu devrais t'intéresser à
la recherche "full-text" plutôt qu'utiliser des LIKE ou des REGEXP (qui sont à la fois plus lents et sensibles à la casse).