[MySQL] Grouper en prenant la plus grande valeur

Grouper en prenant la plus grande valeur [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 13-11-2015 à 14:42:05    

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
Reply

Marsh Posté le 13-11-2015 à 14:42:05   

Reply

Marsh Posté le 13-11-2015 à 15:41:11    

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)),'')

Reply

Marsh Posté le 17-12-2015 à 09:14:09    

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.

Reply

Marsh Posté le 17-12-2015 à 09:16:44    

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 :)

Reply

Marsh Posté le 17-12-2015 à 10:07:37    

+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
Reply

Marsh Posté le 17-12-2015 à 10:14:04    

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

Reply

Marsh Posté le 17-12-2015 à 10:22:05    

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
Reply

Marsh Posté le 17-12-2015 à 10:23:48    

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

Reply

Sujets relatifs:

Leave a Replay

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