conseil bdd et requetes SQL

conseil bdd et requetes SQL - SQL/NoSQL - Programmation

Marsh Posté le 31-01-2008 à 15:48:25    


Bonjour a tous et a toutes :)
 
un petit truc qui me tracasse depuis assez longtemps:
 
j'ai une variable PHP de type tableau, qui contient des identifiant (ca peut aller jusqu a 500 identifiants ou plus).
depuis cette variable, je dois faire une requete sql, et justement là, je me demande comment devrais je proceder!!
 
est il mieux de le faire de cette maniere :
 
foreach($mon_tableau as $id)
{
 SELECT * FROM ma_table WHERE id = '$id'
}
 
ou plutot
 
travailler la variable de maniere a ce que j'ai la requete suivante :
 
SELECT * FROM ma_table WHERE id = '10024' OR id = '11254' OR id = '14524' OR ...
 
 
une derniere question:
j'ai besoin de champs booleen, j'utilise pour cela le type ENUM, mais est il conseille de mettre '0','1' ou plutot 'o','n' ??
 
 
merci de votre aide.
Reda

Reply

Marsh Posté le 31-01-2008 à 15:48:25   

Reply

Marsh Posté le 31-01-2008 à 15:53:28    

(en gros)
 

Code :
  1. $sql = "select * from ma_table where id in (".join($mon_tableau, ", " )." )";

Reply

Marsh Posté le 31-01-2008 à 15:55:33    

pour le type "booléen", peut importe, du moment que c'est spécifié quelque part.
 
généralement, on utilise 0 ou 1, mais c'est quand même mieux quand on as un type "bit".
 
plutôt qu'un ENUM, qui n'est pas du SQL standard, je recommande dans ces cas l'utilisation d'un tinyint (byte) ou même d'un char(1).
quite à rajouter une contrainte sur les valeurs acceptées par le champ, afin de rester standard.

Reply

Marsh Posté le 31-01-2008 à 16:52:18    

Bonjour MagicBuzz et merci pour tes reponses :)
 
wow, je ne connaissais pas 'IN' de SQL :D
pk join et pas implode? est ec plus rapide le join ???
 
concernant le type booleen, g toujours voulu utiliser un char(1), mais je pense que le temps de reponse est plus rapide si c'est un enum ou tinyint. un char(1) est considere come une chaine de caracter et du coup c plus lent. ou je me trompe??? :)

Reply

Marsh Posté le 31-01-2008 à 16:57:48    

question, comment tu alimentes ta:

Citation :

variable PHP de type tableau, qui contient des identifiant (ca peut aller jusqu a 500 identifiants ou plus).

 

A l'instinct je dirais qu'après le in , tu vas apprendre les jointures :o

 
redah75 a écrit :

concernant le type booleen, g toujours voulu utiliser un char(1), mais je pense que le temps de reponse est plus rapide si c'est un enum ou tinyint. un char(1) est considere come une chaine de caracter et du coup c plus lent. ou je me trompe??? :)


Micro-optimisation qui n'en vaut pas le coup ( si elle est avérée, ce dont j'ai tendance à douter)


Message édité par anapajari le 31-01-2008 à 16:59:18

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 31-01-2008 à 17:17:55    

redah75 a écrit :

Bonjour MagicBuzz et merci pour tes reponses :)
 
wow, je ne connaissais pas 'IN' de SQL :D
pk join et pas implode? est ec plus rapide le join ???
 
concernant le type booleen, g toujours voulu utiliser un char(1), mais je pense que le temps de reponse est plus rapide si c'est un enum ou tinyint. un char(1) est considere come une chaine de caracter et du coup c plus lent. ou je me trompe??? :)


pour join vs implode, je ne sais pas, c'est la fonction qui concatène toutes les lignes d'un tableau en les séparant par une chaîne de caractère passée en paramètre. je ne sais pas quel est le nom de la fonction, je ne connais pas pour presque php ;)
 
à mon avis, pour la différence de performances char vs enum, tu te trompes. en toute logique, il n'y a absolument pas de différence mesurable.
et dans le pire des cas, ENUM, qui repose certainement sur un int32 en interne, pourrait bien prendre plus de place et être plus lent.
 
en tout cas, l'aspect performances est à ignorer, car que la différence soit en faveur de l'un ou l'autre, elle sera absolument négligeable.

Reply

Marsh Posté le 31-01-2008 à 17:59:00    

Ah ok, je pensais que l'execution de par ex WHERE active = '1' est plus rapide que WHERE active LIKE 'o' !!

Reply

Marsh Posté le 31-01-2008 à 18:01:36    

anapajari: ma variable type tableau est alimentee comme tout type de tableau. elle contiendra essentiellement les resultats d'une recherche que je souhaite afficher ds une autre page

Reply

Marsh Posté le 31-01-2008 à 18:02:51    

euh... qui t'as parlé de "like" ?
 
tu peux parfaitement utiliser le signe "=" pour tester une chaine de caractères !
 
(et accessoirement, LIKE sans wildcard, ça fait un =)

Reply

Marsh Posté le 31-01-2008 à 18:07:59    

eh ben, j'apprends des choses aujourd'hui :D
 
g toujours cru que LIKE s'utilise pour les chaine de caracteres et le = pour les numeros...
a quoi sert alors le LIKE mise a part l'utilisation des % ??
c'est quoi un wildcard???  :??:

Reply

Marsh Posté le 31-01-2008 à 18:07:59   

Reply

Marsh Posté le 31-01-2008 à 18:10:33    

LIKE, ça sert qu'à l'utilisation des % et %, c'est un wildcard ;)
 
tu peux aussi utiliser ? qui a la même fonction, mais signifie "n'importe quel caractère, une et une seule fois"
 
genre :
 
toto va à la plage
titi va à la plage
tartempion va à la plage
 
select * from matable where phrase like 't?t%'
=> ça retourne que les deux premières lignes.
 
si tu fais
 
select * from matable where phrase like 't%t%'
=> Ca retourne les 3 lignes
 
mais  
 
select * from matable where phrase = 'toto va à la plage'
=> ne retourne que la première ligne, et c'est "infiniment" plus rapide qu'avec un like 'toto%' (vitesse comparable à la recherche d'un nombre, surtout si le champ est indexé)


Message édité par MagicBuzz le 31-01-2008 à 18:11:45
Reply

Marsh Posté le 31-01-2008 à 18:50:50    

ok, merci bp pour ces conseils et informations tres utiles... :)
que serai je devenu sans vous!!! :D

Reply

Marsh Posté le 01-02-2008 à 10:09:04    

redah75 a écrit :

anapajari: ma variable type tableau est alimentee comme tout type de tableau.


No kidding ... [:petitpois2]  

redah75 a écrit :

elle contiendra essentiellement les resultats d'une recherche que je souhaite afficher ds une autre page


oui ok mais ça me dit toujours pas comment tu remplis le tableau.
 
Comme je le disais plus haut, à l'instinct, je pense que tu remplis ce tableau avec une autre requête.
Je reste persuadé que tout cela est faisable en une seule :o


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 01-02-2008 à 10:46:09    

anapajari a écrit :


No kidding ... [:petitpois2]  


 

anapajari a écrit :


oui ok mais ça me dit toujours pas comment tu remplis le tableau.
 
Comme je le disais plus haut, à l'instinct, je pense que tu remplis ce tableau avec une autre requête.
Je reste persuadé que tout cela est faisable en une seule :o


 
 
ca depend de ce que je veux faire mais generalement je l'alimente de cette manier:
boucle
{
 $variable[] = $val
}

Reply

Marsh Posté le 01-02-2008 à 11:05:45    

[:prozac]
ok laisse tomber ...


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 01-02-2008 à 11:15:05    

(et $val, il vient d'où ?)

Reply

Marsh Posté le 01-02-2008 à 11:46:09    

hehe, Anapajari, es tu si desespere que ca???? :)
 
je donne un exemple plus clair :
 
$sel = mysql_query("SELECT id FROM table WHERE ma condition..." )
while($res = mysql_fetch_array($sel))
{
 $variable[] = $res[id];
}
 
est ce mieux?? ;)

Reply

Marsh Posté le 01-02-2008 à 11:53:20    

\o/ On va arriver à ce que je disais ...
 
donc si je resume tu fais ton truc en 3 étapes:
- une 1ere requete alimente un tableau
- tu itères sur chaque élement de ce tableau
- pour chaque element tu effectues une nouvelle requête avec en paramètre un des elements du tableau.
 
Est-ce bien ça?


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 01-02-2008 à 12:42:09    

c'est pas vraiment ca!! :D
ce qui se passe c'est que j'ai une page page1.php
dans page1.php, j'ai fait une requete assez compliquee qui m'a permis d'afficher des resultats sur cette page.
dans une autre page: page2.php, je dois afficher les meme resultats, et afin d'eviter de refaire la meme requete qui est compliquee, je transmets en parametre les identifiant qui me permettront d'afficher ces resultats.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed