8797 sujets

Développement web côté serveur, CMS

Bonjour,

En complément d'un autre post sur le même sujet :

Comportement-etrange-de-variables-MySQL


Connaitriez vous un moyen d'utiliser une variable déclaré dans un select et réutiliser dans le même select ?

j'ai lu la doc MySQL

[URL="http://http://dev.mysql.com/doc/refman/5.0/fr/variables.html"]http://http://dev.mysql.com/doc/refman/5.0/fr/variables.html[/URL]

Mais cela ne m'aide pas ...

[QUOTE]
....
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nom_de_table HAVING b=5;

La raison est que @aa ne contiendra pas la valeur de la ligne courante, mais celle de id pour la dernière ligne acceptée.

La règle générale est de ne jamais assigner et utiliser la même variable dans la même commande. ......[/QUOTE]

Voici ma requête :


SELECT 
  (case when(a.remise_p <> '') then(select politique_commerciale_remises.remise from politique_commerciale_remises where((politique_commerciale_remises.id = a.remise_p) and(politique_commerciale_remises.id_pc = d.id_pc))) else a.remise1 end) AS pourcent_remise,
  (a.prix_p * a.qte) AS prix_total_hors_remise,
  (a.prix_p - ((a.prix_p * (case when(a.remise_p <> '') then(select politique_commerciale_remises.remise from politique_commerciale_remises where((politique_commerciale_remises.id = a.remise_p) and(politique_commerciale_remises.id_pc = d.id_pc))) else a.remise1 end)) / 100)) AS pu_avec_remise,
  ((a.prix_p - ((a.prix_p * (case when(a.remise_p <> '') then(select politique_commerciale_remises.remise from politique_commerciale_remises where((politique_commerciale_remises.id = a.remise_p) and(politique_commerciale_remises.id_pc = d.id_pc))) else a.remise1 end)) / 100)) * a.qte) AS prix_total_ligne,
  a.id,
  a.qte,
  d.id_commercial,
  a.ordre,
  concat(ucfirst(h.usr_titre), _latin1' ', ucfirst(h.usr_nom), _latin1' ', ucfirst(h.usr_prenom)) AS nom_commercial,
  d.id_mag,
  g.libelle AS nom_mag,
  d.id_societe,
  f.libelle AS nom_societe,
  a.commentaire_bdc_lignes,
  a.id_bdc,
  d.id_pc,
  a.remise_p AS id_remise_pc,
  a.id_emplacement,
  b.libelle AS nom_emplacement,
  a.id_format,
  c.libelle AS nom_format,
  a.remise1,
  a.remise2,
  e.remise AS nom_remise_pc,
  a.prix_p,
  a.total_ht,
  a.emplacement_rigeur,
  a.no_semaine,
  a.annee,
  a.`status`,
  i.id AS id_avoir,
  i.status_avoir_lignes,
  a.groupe
FROM
  bdc_lignes a
  LEFT OUTER JOIN bdc_emplacements_listes b ON (a.id_emplacement = b.id)
  LEFT OUTER JOIN bdc_formats_listes c ON (a.id_format = c.id)
  LEFT OUTER JOIN bdc d ON (a.id_bdc = d.id_bdc)
  LEFT OUTER JOIN politique_commerciale_remises e ON (a.remise_p = e.id)
  LEFT OUTER JOIN societes f ON (d.id_societe = f.id)
  LEFT OUTER JOIN liste_mag g ON (d.id_mag = g.id)
  LEFT OUTER JOIN utilisateurs h ON (d.id_commercial = h.usr_id)
  LEFT OUTER JOIN avoirs_lignes i ON (i.id_bdc_lignes = a.id)


J'aimerais pouvoir réutiliser facilement par exemple :


  (case when(a.remise_p <> '') then(select politique_commerciale_remises.remise from politique_commerciale_remises where((politique_commerciale_remises.id = a.remise_p) and(politique_commerciale_remises.id_pc = d.id_pc))) else a.remise1 end) AS pourcent_remise


Pour calculer d'autre valeur (comme rajouter une remise etc ...), mais je suis obligé de reprendre toute la ligne.

Pouvoir créer une variable contenant l'information (numérique) m'aiderais bien (j'imagine que je ne suis pas le seul).

Le seul moyen que j'ai trouvé pour le moment c'est de déclarer les variables dans un genre de @maVar:=(select ...) et de la réutiliser dans une nouvelle requête, mais cela n'est pas très souple ...


Merci de votre aide
Modifié par caledonien (27 Oct 2011 - 02:38)
Hello.

Pourquoi essayer de faire quelque chose très clairement déconseillé par la doc Smiley ohwell ?
Je vois pas trop ou est le manque de souplesse dans le fait de devoir faire un SET de ta variable juste avant ton SELECT. Tu as plus de détails à nous donner peux-être?
Re,

désolé pour la réponse tardive, le principe de faire une requête externe pour y stoker un nombre dans une var m'aide pas trop car le var sont re initialisé sur chaque lignes.

Mais bon je me cassais la tête pour rien, car cette requête fonctionne


SELECT 

  @prix_unitaire_avec_remise:=(((a.prix_p - ((a.prix_p * (case when(a.remise_p <> '') then(select politique_commerciale_remises.remise from politique_commerciale_remises where((politique_commerciale_remises.id = a.remise_p) and(politique_commerciale_remises.id_pc = d.id_pc))) else a.remise1 end)) / 100)))) as prix_unitaire_avec_remise, 
  @prix_total_ligne_hors_ER:=(@prix_unitaire_avec_remise*a.qte) as prix_total_ligne_hors_ER,
  @prix_total_ligne:=(a.prix_p * (a.emplacement_rigeur/100))+@prix_total_ligne_hors_ER as prix_total_ligne,


  @pourcent_remise := (case when(a.remise_p <> '') then(select politique_commerciale_remises.remise from politique_commerciale_remises where((politique_commerciale_remises.id = a.remise_p) and(politique_commerciale_remises.id_pc = d.id_pc))) else a.remise1 end) AS pourcent_remise,
....
FROM
  bdc_lignes a
  LEFT OUTER JOIN bdc_emplacements_listes b ON (a.id_emplacement = b.id)
  LEFT OUTER JOIN bdc_formats_listes c ON (a.id_format = c.id)
  LEFT OUTER JOIN bdc d ON (a.id_bdc = d.id_bdc)
  LEFT OUTER JOIN politique_commerciale_remises e ON (a.remise_p = e.id)
  LEFT OUTER JOIN societes f ON (d.id_societe = f.id)
  LEFT OUTER JOIN liste_mag g ON (d.id_mag = g.id)
  LEFT OUTER JOIN utilisateurs h ON (d.id_commercial = h.usr_id)
  LEFT OUTER JOIN avoirs_lignes i ON (i.id_bdc_lignes = a.id)


Mais dommage pas dans une vue Smiley smile mais si sa peut aider quelqu'un ...

Bonne jounrée