Page 1 sur 1

SELECT et MIN() avec plusieurs champs

Posté : 19 nov. 2009, 23:08
par Moxika
Bonjour :)
Je debute en php et je me suis fixé de faire un petit moteur de recherche. J'ai pas mal galeré pour en arriver la ou j'en suis, mais je crois avoir atteint ma limite, et j'ai besoin d'aide, mais surtout de conseils par rapport a mon code (qui est grosso modo un copier collé de mal d'exemple que j'ai deniché sur le net) J'utilise une base de donnée SQL avec un table items composée des champs id, vendeur, nom, image, tags et prix. Cette table est remplie d'items plus ou moins inventés, tous en rapport avec le medieval fantastique.

J'ai reussi a coder ce que j'appelle la recherche global, c'est a dire que je tape epée dans ma zone de texte, et toutes les epées vendues sur le royaume apparaissent dans un tableau, avec le prix, le vendeur, l'image etc..
J'ai aussi reussi (enfin, j'ai bien pomper surtout) a faire en sorte que la recherche soit plus precise en tapant deux(ou plus) mots clefs (tags), par exemple, je peux ecrire epée courte, ou bien epee lanfeust pour afficher toutes les épees vendues par Lanfeust.

La ou je bute, c'est dans une option de filtrage via un bouton. En effet, j'aimerai qu'il soit possible, apres avoir fait une premiere recherche globale, de cliquer sur un bouton qui filtrerai les resultats de la premiere recherche pour ne laisser que le moins cher de chaque item. Par exemple, si je fais une recherche globale avec le mot épée, mon tableau va se peupler de 50 items, (5 types d'épées vendues par 10 marchands differents). En cliquant sur le bouton, je voudais qu'il ne reste que 5 items (la moins chere de chaque type d'epee).

J'ai d'abrod cru que j'avais reussi, en utilisant un min() dans une requete SQL
$result = mysql_query("SELECT nom, image, vendeur, MIN(prix) AS prix FROM matable GROUP BY nom ORDER BY prix");
matable etant une table intermedaire regroupant les resultats de la premiere recherche.

Le probleme avec cette requete, c'est que si elle me trouve bien le moins cher des items, elle n'affiche pas le bon vendeur qui va avec. j'ai essayé un peu tout et n'importe quoi, mais mes connaissances etant limitées, ca n''a pas mené a grand chose. :( un peu d'aide, une piste, un indice, n'importe quoi serait vraiment tres appreciable :)

je colle mon (tres moche) code:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" media="screen" type="text/css" title="Design" href="style.css" />
</head>

<body>

<form action="index.php" method="get">
Cherchez: <input type="text" name="i" />
<input type = "hidden" name = "moinsCher" value = "0" />
<input type="submit" value="Go"/>
</form>


<?php

if (isset($_GET["i"]))
 {
 $entree = $_GET["i"]; 
 $entree2 = $_GET["moinsCher"];
require("connection.php");


// plusieurs mots clefs dans la recherche +++++++++++++
$mots = explode(" ", $entree);  
$nombre_mots = count($mots); 
$valeur_requete = '';
for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) 
{
$valeur_requete .= 'AND tags LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; 
}
$valeur_requete = ltrim($valeur_requete,'AND'); 
///////////////////////////////////////////////////////
 

 

if ($entree2 == 1)
 {
 
$create_table = "CREATE TEMPORARY TABLE matable AS SELECT * FROM item WHERE $valeur_requete";
$lacreation = mysql_query($create_table) or die ('Erreur création table temporaire');
$result = mysql_query("SELECT nom, vendeur, image,  MIN(prix) AS prix FROM matable GROUP BY nom ORDER BY prix"); // recherche filtrée
 }
else {$result = mysql_query("SELECT * FROM item WHERE $valeur_requete ORDER BY prix");} // recherche globale




// TABLEAU ///////////////////////////////////

echo "<table border='1'>
<tr>
<th>Vendeur</th>
<th>Prix</th>
<th>Item</th>
</tr>";

?>


<form action="index.php" method="get">
 <input type = "hidden" name = "moinsCher" value = 1 />
 <input type = "hidden" name = "i" <?php echo 'value="' . $entree . '"'; ?>  />
 <input type="submit" value = "Moins Cher"/>
</form>

 <?php

while($row = mysql_fetch_array($result))
   {
  echo "<tr>";
		echo "<td>" . $row['vendeur'] . "</td>";
		echo "<td>" . $row['prix'] . "</td>";
		echo "<td>" . "<a href='index.php?i=" . $row['nom'] . "  '>" . " <img src=images/" . $row['image'] . " />" . "</a>" . $row['navn'] . "</td>";
  echo "</tr>";
   } 
  
echo "</table>";


mysql_close($con);

}

?>

</body>
</html>

Re: SELECT et MIN() avec plusieurs champs

Posté : 19 nov. 2009, 23:35
par animithra
Bonsoir :)

Bon en regardant de près et avec le recul de l'heure qu'il est, je pense que ça vient de la façon dont tu interprète ta requête.

Pour reprendre l'expression d'un de mes anciens profs "traduis-la ta satanée requête !!!! tu verras bien ce qui ne va pas".
Bon le ton est un peu dur mais l'idée y est :

SELECT = je sélectionne
nom = le nom
image = l'image
vendeur = le marchand
MIN(prix) AS prix = le prix le plus bas comme prix
FROM matable = depuis ma table
GROUP BY nom = en regroupant par nom
ORDER BY prix = et en triant par prix

Or, toi ce que tu veux ça serait plutôt du goût :

Je sélection le nom, l'image, le marchand (et éventuellement le prix) depuis ma table où je correspond à mes mots clés et où je suis le moins cher en regroupant par type.

D'où :
SELECT nom, image, vendeur FROM items WHERE (les conditions prédéfinies) GROUP BY type ORDER BY prix LIMIT 0,1;

Maintenant - et compte tenu de l'heure - je ne garantie pas la totalité de mon analyse.
Je t'encourage à la tester préalablement à la mano sous phpMyAdmin et à vérifier si cela correspond à ce que tu cherchais.
Le cas échéant tu peux te taper une danse de la joie et poster résolu, dans le cas contraire, je serai à nouveau de passage sur le forum demain matin avec des idées beaucoup plus clair (dormirrrrrrrrrr) et des réflexions plus avancées sur ton problème.

D'ici là, bonne continuation, bonne nuit, bonne progra ;)

Re: SELECT et MIN() avec plusieurs champs

Posté : 20 nov. 2009, 00:15
par Moxika
Merci beaucoup pour ton aide!

Il se fait tard et je n'ai pas eu beaucoup le temps de bien tester ta requete, mais j'ai quand meme pu voir quelque chose qui n'allait pas:

Lorsque je tape epee courte dans ma recherche globale, j'ai 10 epees courtes avec 10 prix differents qui pop, je filtre, il ne me reste plus que la moins cher, ca, ca a l'air d etre bon.
Par contre, lorsque je ne tape que epee en recherche globale, et que je filtre, seul l'epee la moins chere toute categories confondues s'affiche (la vieille epée rouillé quoi :mrgreen: )

J'ai du modifier un peu la requete par contre, n'ayant pas de champs type, j'ai utilisé le champs nom a la place (GROUP BY nom).


En tous cas excellent conseil que de decrypter sa requete, c'est vrai que j'ai tendance a y aller a tatons sans meme essayer de comprendre ce que j'ecris!

Ca ne serait pas possible sinon, de faire dans une boucle autant de requetes qu'il y a de type d'item (de nom differents en fait)dans mon tableau, chacune ne selectionnerai que l'item le moins cher, et de reuinir les resulats dans une table intermediare et aller les chercher avec un SELECT * ? (oula, en fait je vais plutot aller me coucher aussi, j'ai une crampe au cerveau la)

++

Re: SELECT et MIN() avec plusieurs champs

Posté : 20 nov. 2009, 12:54
par animithra
Bonjour :)

Bien sûr que tu peux disséquer le tout !

Tu peux faire une première requête qui récupère ton paramètre global puis boucler sur chaque résultat pour le paramètre restrictif.

Pour la boucle, tu peux utiliser :
$texteRequete = "ma requete SQL";
$requete = mysql_query($texteRequete );
while($result = mysql_fetch_array($requete)){
/*
traitement en boucle pour chaque résultat.
*/
}

Bonne progra ;)