si la valeur d'une variable existe deja

si la valeur d'une variable existe deja - PHP - Programmation

Marsh Posté le 13-02-2006 à 09:58:29    

bonjour,
je cherche une solution pour afficher un enregistrement uniquement si l'une des valeurs n'a pas encore été declaré.
 
exemple:  
si mes enregistrements sont:
enreg1| 2006-02-12
enreg2| 2006-02-12
enreg3| 2006-02-13
 
alors on affiche uniquement :
enreg1| 2006-02-12
enreg3| 2006-02-13
etant donné que la date etait la meme sur enreg 1 et 2
 
j'aibien trouvé une solution pour faire ce que je veux, mais je passe par les variables de session

Code :
  1. <? echo'<table>';
  2. while( $resultat_date = mysql_fetch_array($req_date)){
  3. $_SESSION['le_moi']=$le_moi;
  4. $le_moi=$resultat_date['date']);
  5. if($_SESSION['le_moi']!=$le_moi){
  6. echo '<tr><td>'.$le_moi.'</td></tr>';
  7. }
  8. echo'</table>'; ?>


alors ya t'il une solution sans passer par les variables de session? ...
merci de votre aide

Reply

Marsh Posté le 13-02-2006 à 09:58:29   

Reply

Marsh Posté le 13-02-2006 à 10:36:08    

select enreg, date  
from table
group by date
order by date


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 13-02-2006 à 10:41:09    

euh.
select distinct, plutôt qu'un group by, c'est fait pour.[:dawao]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 13-02-2006 à 10:42:37    

Avec distinct ça va lui prendre à la fois "enreg1| 2006-02-12" et "enreg2| 2006-02-12" a priori, c'est sur tout le tuple.
 
Sauf s'il sélectionne que les dates, mais je vois pas l'intérêt.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 13-02-2006 à 10:47:13    

ah oui, tiens, j'avais pas tout lu.[:chrisbk]
M'enfin un truc comme tu fais c'est pas valide sous oracle, par exemple...il  se paierait un  

Citation :

enreg
*
ERREUR à la ligne 1 :
ORA-00979: not a GROUP BY expression


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 13-02-2006 à 10:49:31    

Ouais, c'est une sorte d'astuce qu'il m'arrive d'utiliser sous mysql, mais il est clair que group by est pas vraiment fait pour ça.
 
N'empêche que pour le coup, c'est utile.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 13-02-2006 à 10:50:12    

une autre solution, c'est de sélectionner tous les enregistrements tels qu'il n'existe pas d'enregistrement ayant à la fois la même date et un n° d'enregistrement inférieur :
 

Code :
  1. SELECT t1.enreg, t1.date
  2. FROM matable t1
  3. WHERE NOT EXISTS (
  4.  SELECT 1 FROM matable t2
  5.  WHERE t1.date = t2.date
  6.  AND t2.enreg < t1.enreg)


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 13-02-2006 à 10:51:02    

(ce qui est plus propre, et doit fonctionner partout.:o)


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 13-02-2006 à 11:06:52    

Ou encore
 

Code :
  1. SELECT t1.enreg, t1.date
  2. FROM matable t1
  3. WHERE t1.enreg = (
  4.   SELECT min(t2.enreg)
  5.   FROM matable t2
  6.   WHERE t2.date = t1.date
  7. )


 
Evidemment faut dans les deux cas qu'"enreg" soit numérique.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 13-02-2006 à 11:08:03    

mais juste en prenant le min ça marcherait pas?

Code :
  1. SELECT min(enreg), date  
  2. FROM TABLE
  3. GROUP BY date
  4. ORDER BY date


ce qui doit fonctionner partout et evite la sous-requete dans le exists

Message cité 1 fois
Message édité par anapajari le 13-02-2006 à 11:08:31
Reply

Marsh Posté le 13-02-2006 à 11:08:03   

Reply

Marsh Posté le 13-02-2006 à 11:11:08    

anapajari a écrit :

mais juste en prenant le min ça marcherait pas?

Code :
  1. SELECT min(enreg), date  
  2. FROM TABLE
  3. GROUP BY date
  4. ORDER BY date


ce qui doit fonctionner partout et evite la sous-requete dans le exists


 
euh oui, quitte à ne pas avoir le cerveau trop dans la brume, autant se servir du min correctement jusqu'au bout! [:rofl]
 
Bon après ma version a l'avantage de permettre des méthodes de tri plus complexes... :whistle:
...et de toute manière le sgbd exécute probablement exactement la même chose dans les 2 cas, au final...[:god]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 13-02-2006 à 11:16:37    

J'avais pas mis min() au début parce que j'pensais qu'enregistrement était de la forme "enreg1", "enreg2" et pas un nombre... évidemment si c'est du numérique, min() et basta.
 
Mais si c'est une chaîne de caractère de ce genre (ce qui serait stupide ceci dit), y'a a priori seulement ce que j'avais mis et la solution de skeye (le "<" agissant comme comparateur lexicographique) qui passeraient.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 13-02-2006 à 11:37:31    

sielfried a écrit :

J'avais pas mis min() au début parce que j'pensais qu'enregistrement était de la forme "enreg1", "enreg2" et pas un nombre... évidemment si c'est du numérique, min() et basta.
 
Mais si c'est une chaîne de caractère de ce genre (ce qui serait stupide ceci dit), y'a a priori seulement ce que j'avais mis et la solution de skeye (le "<" agissant comme comparateur lexicographique) qui passeraient.


ça marche aussi min sur des strings .. et tu auras bien "enreg1" < "enreg2".
Il faut juste eventuellement faire attention à la casse des mots.

Reply

Marsh Posté le 13-02-2006 à 12:00:01    

anapajari a écrit :

ça marche aussi min sur des strings .. et tu auras bien "enreg1" < "enreg2".


 
Pas sur mon MySQL local... [:spamafote]  
 
Ca me renvoie un tuple vide.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 13-02-2006 à 12:08:09    

From the doc

Citation :


MIN(expr), MAX(expr)
 
Returns the minimum or maximum value of expr. MIN() and MAX() may take a string argument; in such cases they return the minimum or maximum string value. See Section 7.4.5, “How MySQL Uses Indexes”.  


[:spamafote]

Reply

Marsh Posté le 13-02-2006 à 12:13:05    

Pfff, ok au temps moi, forcément je testais sur une table qui peut contenir une chaîne vide... c'est malin. [:pingouino]
 


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Sujets relatifs:

Leave a Replay

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