Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2873 connectés 

  FORUM HardWare.fr
  Programmation

  [mysql]"max-concat trick", explication

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[mysql]"max-concat trick", explication

n°52283
boom
Posté le 10-08-2001 à 22:49:08  profilanswer
 

j'ai trouvé dans le manuel de mysql un truc bien pratique, c'est le "max-concat trick", et comme je ne connais pas très bien les instructions sql ou mysql, y aurait-il qqn pour me l'expliquer?
 
voici la partie du manuel d'ou j'ai tiré le "max concat trick" :
 
--------------------------------------------------
 
8.3.4 La ligne contenant le maximum d'une colonne d'un groupe
"Pour chaque article, trouver le vendeur le plus cher."  
 
En ANSI SQL on pourrai le faire avec une sous selection, comme ceci :  
 
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article)
 
Avec MySQL il vaut mieux le faire en deux étapes :  
 
Retrouver la liste des (article,prix_maxima). 8.3.4 La ligne contenant le maximum d'une colonne d'un groupe.  
pour chaque article trouvé, retrouver la ligne correspondante, pour lire le nom du vendeur. price.  
Cela peut se faire facilement avec une table temporaire:  
 
CREATE TEMPORARY TABLE tmp (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
price DOUBLE(16,2) DEFAULT '0.00' NOT NULL);
 
LOCK TABLES article read;
 
INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;
 
SELECT article, dealer, price FROM shop, tmp
WHERE shop.article=tmp.articel AND shop.price=tmp.price;
 
UNLOCK TABLES;
 
DROP TABLE tmp;
 
Si vous n'utislisez pas de table temporaire, il vous faut verrouiller la table.  
 
"Est ce qu'il est impossible de faire cela avec une seule requête?"  
 
Oui, mais en utilisant une astuce qui s'appelle : "MAX-CONCAT trick":  
 
SELECT article,
SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
0.00+LEFT( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
FROM shop
GROUP BY article;
 
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | C | 1.69 |
| 0004 | D | 19.95 |
+---------+--------+-------+
 
Le dernier exemple peut être fait de manière plus efficace, en effectuant la scission de la colonne au niveau du client;  
 
-------------------------------------------------
 
merci

mood
Publicité
Posté le 10-08-2001 à 22:49:08  profilanswer
 

n°52687
boom
Posté le 14-08-2001 à 01:38:50  profilanswer
 

up


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [mysql]"max-concat trick", explication

 

Sujets relatifs
[PHP][MYSQL] aide pour petite requete...svpServeur MySQL contactable à distance
[mysql] taille limite d'une base[MySQL] Pb de data remplacée anormalement
[C++]Connection à une base mysqlquestion php/mysql
[MySQL] une erreur chelou[MySql-PHP] Comment...
Config MySQL - Comment faire pour ....[php/mysql]recuperer dans une variable ce que contient l un des champs
Plus de sujets relatifs à : [mysql]"max-concat trick", explication


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR