Afficher les résultats de 2 requêtes dans une seule boucle

mistral
Invité n'ayant pas de compte PHPfrance

22 janv. 2006, 00:01

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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

22 janv. 2006, 00:09

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.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

mistral
Invité n'ayant pas de compte PHPfrance

22 janv. 2006, 01:14

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]

mistral
Invité n'ayant pas de compte PHPfrance

22 janv. 2006, 01:17

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> ";
}
?>

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

22 janv. 2006, 01:59

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

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

mistral
Invité n'ayant pas de compte PHPfrance

22 janv. 2006, 02:16

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

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

22 janv. 2006, 02:31

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 :?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

mistral
Invité n'ayant pas de compte PHPfrance

22 janv. 2006, 15:04

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 ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

22 janv. 2006, 15:26

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 :-k
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.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

mistral
Invité n'ayant pas de compte PHPfrance

22 janv. 2006, 16:09

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.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

22 janv. 2006, 22:24

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.")'";

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 janv. 2006, 22:35

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).