Requête SQL

Répondre
coringan
le 11/10/2009 à 05:54
coringan
Quelqu’un pourrait-il me donner le tuyau sur le truc suivant ?

Sur 1000 piments par exemple

Je fais
SELECT count(*) FROM piment WHERE pulpe = rouge OR pepin = 25
Puis j’en trouve disons 300

Au lieu de recommencer à parcourir les 1000 enregistrements, je préfère faire
SELECT count(*) FROM piment WHERE pulpe = rouge AND pepin = 25
Sur les 300 préalablement trouvés
Puis j’en trouve 150

Je refais
SELECT count(*) FROM piment WHERE pulpe = rouge
Sur les 150 préalablement trouvés
Puis j’en trouve disons 100

Un ALIAS pourrait-il entrer en jeu, si oui, quand et comment ?
Je fais ce qui me plaît, et ce que je fais me plaît !
LupusMic
le 11/10/2009 à 12:24
LupusMic
Qu'est-ce qu'un alias pour toi ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
laura
le 11/10/2009 à 16:37
laura
Pourquoi ne pas faire directement la requête 2 smiley

Pourquoi faire un pré-tri alors que t'as directement le résultat avec la 2ème requête. (c'est plus rapide et moins coûteux en resource)

Sinon pour répondre vraiment à la question, tu peux pour faire un pré-tri, faire une requête imbriquée (le 2ème SELECT est dans la condition WHERE).
Mais là, dans ton exemple, je ne vois pas l'intérêt smiley
Des étoiles dans les yeux, le ciel pour m'évader
laura
le 11/10/2009 à 17:04
laura
Sinon tu peux à partir de la 1ere requête (sans le count) faire un tri avec PHP pour trier tes piments.
SELECT * FROM piment WHERE pulpe = rouge OR pepin = 25

Tu fais un tableau qui représente tes piments :

$piments=array('pulpe_rouge'=>$pulpe_rouge,'pepin'=>$pepin,'sans_pepin'=>$sans_pepin);


et tu incrémentes à chaque boucle celui qui correspond
Des étoiles dans les yeux, le ciel pour m'évader
coringan
le 11/10/2009 à 17:51
coringan
L’intérêt c’est ceci Laura :

if (l’une ou l’autre des conditions est vraie)
Fais ceci (et je gagne du temps)

elseif (les deux sont vraies)
On ne fait rien (message correspondant)

elseif (la 1ère est vraie)
On ne fait rien (message correspondant)

elseif (la 2ère est vraie)
On ne fait rien (message correspondant)

Ce sera du cas par cas, raison pour laquelle je voulais une table temporaire avec de moins en moins de tri à faire pour chaque étape.

Je vais essayer ta formule.

$piments=array('pulpe_rouge'=>$pulpe_rouge,'pepin'=>$pepin,'sans_pepin'=>$sans_pepin);
Je fais ce qui me plaît, et ce que je fais me plaît !
coringan
le 11/10/2009 à 18:03
coringan
Non ce n'est pas vrai pour le if
c'est plutôt

if (les 2 sonditions sont fausses)
Fais directement ceci (et je n'ai plus besoin d'examiner les autres possibilités)
Je fais ce qui me plaît, et ce que je fais me plaît !
laura
le 11/10/2009 à 22:16
laura
Je ne comprends pas trop tes 2 messages, c'est dur de comprendre sans code smiley
C'est sans doute logique pour toi car t'as ton code devant les yeux mais pour nous qui n'avons aucune idée de ton programme c'est du chinois smiley
Des étoiles dans les yeux, le ciel pour m'évader
coringan
le 11/10/2009 à 23:18
coringan
Ok, c’est sûrement quelque chose de courant et tous ceux qui font ce genre de programme sont certainement confrontés à cette phase d’une manière ou d’une autre
Voici un exemple du code :

<?php 
$sql = 'SELECT count(*) FROM piment WHERE pseudo = "'.mysql_escape_string($Pseudo).'" OR courriel = "'.$Courriel.'"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$data = mysql_fetch_array($req);

// Si ce pseudo ou ce courriel n'existe pas encore dans la base de données, insérer
if ($data = $data[0] == 0)
{
insérer le membre
Ouvrir la session
}
else
{
$sql = 'SELECT count(*) FROM piment WHERE pseudo = "'.mysql_escape_string($Pseudo).'" AND courriel = "'.$Courriel.'"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

if ($data = $data[0] > 0)
{
Message
}
else
{
$sql = 'SELECT count(*) FROM piment WHERE pseudo = " '.mysql_escape_string($Pseudo).'"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

if ($data = $data[0] > 0)
{
Message
}
else
le dernier cas (le courriel existe déjà)
}
}
?>


Je ne voudrais pas recommencer le parcours de tous les enregistrements lors de mon 2ème SELECT, mais seulement les 300 enreg concernés par le premier SELECT (le second if est imbriqué dans le 1er et le 3ème dans le second).
Je fais ce qui me plaît, et ce que je fais me plaît !
coringan
le 11/10/2009 à 23:21
coringan
Ça mache très bien comme ça mais je pense qu'il existe un autre moyen plus Pro que celui là...
Je fais ce qui me plaît, et ce que je fais me plaît !
LupusMic
le 12/10/2009 à 04:19
LupusMic
Early optimization is the root of Evil.

C'est typiquement ce que tu fais, sans comprendre ce que tu fais. Lorsque tu effectue un select, MySQL ne parcours pas l'ensemble des enregistrement. Il est plus intelligent que ça.

Tu n'as donc pas besoin d'optimiser ce qu'optimise déjà la base de données. Si véritablement il y a des problèmes de performance, il faut analyser la requête SQL (avec la clause explain), et en tirer les conséquences : ajouter un index sur un champ (par exemple ton champ email), ou avoir recours à des tables précalculées ou des vues.

Mais dans un premier temps, ne t'emmerde pas. Écris quelque chose de fonctionnel et de sécurisé. Les problèmes de performance ne viennent que dans un second temps.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre
LoadingChargement en cours