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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Grouper en prenant la plus grande valeur

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL] Grouper en prenant la plus grande valeur

n°2269601
Shadow aok
Moitié de demi en 3/4 d'entier
Posté le 13-11-2015 à 14:42:05  profilanswer
 

Hello,

 

Sous MySQL 5.5, j'ai des grilles de consommations voip associées à des destinations.
Une même destination peut avoir plusieurs paliers (genre "AFRIQUE DU SUD Fixe (palier 1)", "AFRIQUE DU SUD Fixe (palier 2)" ....

 

L'idée est d'afficher la grille complète avec les tarifs vers chaque type de destination en prenant le prix du palier le plus élevé pour un client donné (1 dans l'exemple).
Donc d'afficher "AFRIQUE DU SUD Fixe" ou "AFRIQUE DU SUD Mobile" avec le tarif du palier le plus élevé, sans afficher les différents paliers, de façon à connaître le tarif le plus élevé possible vers une destination (en fixe et mobile).

 

Il faut afficher toute la grille, donc tous les tarifs dans customers_prices, avec le nom de la destination.

 
Code :
  1. CREATE TABLE IF NOT EXISTS `customers_prices` (
  2.   `destination_id` mediumint(8) unsigned NOT NULL,
  3.   `customer_id` tinyint(3) unsigned NOT NULL DEFAULT '1',
  4.   `price` decimal(7,5) unsigned NOT NULL DEFAULT '0.00000',
  5.   KEY `customer_id` (`customer_id`),
  6.   KEY `destination_id` (`destination_id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  8. Exemple de données :
  9. 5 1 0.01398
  10. 6 1 0.01442
  11. 7 1 0.01794
  12. 8 1 0.20500
  13. 9 1 0.03084
  14. CREATE TABLE IF NOT EXISTS `destinations` (
  15.   `destination_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  16.   `destination_name` varchar(255) NOT NULL,
  17.   PRIMARY KEY (`destination_id`),
  18.   UNIQUE KEY `destination` (`destination_name`)
  19. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
  20. Exemple de données :
  21. 5   AFRIQUE DU SUD Fixe (palier 1)
  22. 6   AFRIQUE DU SUD Fixe (palier 2)
  23. 7   AFRIQUE DU SUD Mobile (palier 1)
  24. 8   AFRIQUE DU SUD Mobile (palier 2)
  25. 9   AFRIQUE DU SUD Mobile (palier 3)
 

Pour n'avoir que le nom de la destination sans le palier, c'est la partie facile :
replace( d.destination_name, concat( ' (p', substring_index( d.destination_name, ' (p' , -1 ) ) , '' )

 

Une idée ?

 

Merci.
Par contre, toutes les destinations n'ont pas forcément de palier, donc là il faut retourner le seul résultat possible.


Message édité par Shadow aok le 13-11-2015 à 15:33:20
mood
Publicité
Posté le 13-11-2015 à 14:42:05  profilanswer
 

n°2269610
Shadow aok
Moitié de demi en 3/4 d'entier
Posté le 13-11-2015 à 15:41:11  profilanswer
 

Bon, j'y arrive comme ceci, mais c'est lent et un peu moche.
Si quelqu'un a mieux, je suis preneur.
 

Code :
  1. SELECT
  2. d.destination_id,
  3. REPLACE(d.destination_name,CONCAT(' (p',substring_index(d.destination_name, ' (p',-1)),'') as destination_name,
  4. sp.connection,
  5. (SELECT MAX(cpm.price)
  6.  FROM customers_prices cpm
  7.  LEFT JOIN destinations dm USING (destination_id)
  8.  WHERE
  9.   cpm.customer_id = 1
  10.   AND REPLACE(dm.destination_name,CONCAT(' (p',substring_index(dm.destination_name, ' (p',-1)),'') = REPLACE(d.destination_name,CONCAT(' (p',substring_index(d.destination_name, ' (p',-1)),'')
  11. ) as price,
  12. sp.level, sp.units
  13. FROM customers_prices sp
  14. LEFT JOIN destinations d ON sp.destination_id = d.destination_id
  15. WHERE
  16. customer_id = 1
  17. GROUP BY REPLACE(d.destination_name,CONCAT(' (p',substring_index(d.destination_name, ' (p',-1)),'')

n°2271802
deliriumtr​emens
sic transit intestinal...
Posté le 17-12-2015 à 09:14:09  profilanswer
 

Honnêtement, je reverrais la structure de mes tables, si j'étais toi.
 
Parce que lorsqu'on doit commencer, dans les requêtes, à faire du replace et du substring pour générer ce qu'on veut, ça doit généralement faire réagir.
 
Pour moi, la notion de "fixe" "mobile" d'un côté, et le niveau de paliers devraient être sortis de ton champ destination, et mises dans deux autres tables.
 
Les problèmes de lenteur seront probablement aussi améliorés avec ce genre de structure.

n°2271803
Shadow aok
Moitié de demi en 3/4 d'entier
Posté le 17-12-2015 à 09:16:44  profilanswer
 

J'avais oublié ce topic et au final, cela a été revu :)
Mais je ne peux pas changer la table destinations, car c'est un pré-requis (ce sont les grilles de facturation fournisseurs en l'état, chargée depuis les csv fournis).
Donc je fais au mieux :)

n°2271806
rufo
Pas me confondre avec Lycos!
Posté le 17-12-2015 à 10:07:37  profilanswer
 

+1 pour mettre "fixe"/"mobile" dans un champ et les paliers dans un autre.
Des énums par ex. ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2271810
Shadow aok
Moitié de demi en 3/4 d'entier
Posté le 17-12-2015 à 10:14:04  profilanswer
 

Ceci dit, je pourrais garder la structure actuelle, tout en rajoutant une colonne pour le type, que je renseignerais au remplissage de la table.

n°2271811
rufo
Pas me confondre avec Lycos!
Posté le 17-12-2015 à 10:22:05  profilanswer
 

Non, dans destinations, il faut 2 champs en plus. Ca change donc la structure. :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2271812
Shadow aok
Moitié de demi en 3/4 d'entier
Posté le 17-12-2015 à 10:23:48  profilanswer
 

Oui, cela la change, mais du moment que c'est juste des colonnes en plus, ça n'est pas très grave :)


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

  [MySQL] Grouper en prenant la plus grande valeur

 

Sujets relatifs
Additionner la valeur numérique de plusieurs TextBox[EXCEL ou VBA] Chercher une valeur parmi un ensemble de valeur
Tableau 2D, chercher une valeur dans une colonne et ramener la secondeFormulaire HTML CSS vers PHP MYSQL
[MySQL] Comment distinguer les caractères accentuésMacro copier coller suivant la valeur d'une cellule
[SQL Server/Cobol] Maj colonne NULL ou valeur non NULLRequête mysql probleme
Sélectionner une valeur dans un array multidimensionnel (+SQL & PDO)Liste déroulante récupération valeur
Plus de sujets relatifs à : [MySQL] Grouper en prenant la plus grande valeur


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