[Résolu] Update / Select LEFT JOIN / et mysql
18 messages
• Page 1 sur 2 • 1, 2
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
[Résolu] Update / Select LEFT JOIN / et mysql
Bon j'ai une pb de requetes
Alors ne rigolez pas quand vous allez la voir lol
Et oui c'est le binz
Si vous aviez une idée pour simplifier ca

Alors ne rigolez pas quand vous allez la voir lol
- Code: Tout sélectionner
$query = "SELECT ID, SUM(Valorisation) FROM laTable1 LEFT JOIN laTable2 ON Membre_laTable1 = Membre_laTable2 GROUP BY ID "
$mysql_result = mysql_query($query, $mysql_link);
while ($row = mysql_fetch_row($mysql_result))
{
if (is_null($row[1]))
{
$row[1] = "0";
}
$query1 = "UPDATE laTable3 ";
$query1 .= "SET Date = '$date_maj', Titres = '$row[1]', Total = Liquidites + Titres - Emprunt WHERE Membre = '$row[0]' ";
$mysql_result1 = mysql_query($query1, $mysql_link);
}
Et oui c'est le binz
Dernière édition par finstreet le Mer Mai 31, 2006 13:34, édité 1 fois.
- FlorentP
- WRInaute discret

- Messages: 145
- Inscription: 25 Juin 2005
Total = Liquidites + Titres - Emprunt
Alors qu'en même temps tu update Titres => dans total tu gardes l'ancienne valeure de Titres ou bien la nouvelle que tu met à jour ? (désolé de répondre à ta question par une question n'ayant rien a voir
)
Pour ton truc, quelque chose du genre, ça fonctionne ? (dans le sens est ce que mysql veut bien de ce genre de syntaxe déjà ?
)
UPDATE t3 SET Titres=(SELECT sum(valorisation) FROM t2 WHERE membre_t2=t3.Membre), Total=Liquidites + Titres - Emprunt, Date = '$date_maj'
(sous requete = mysql 4.1 mini sinon s'même pas la peine)
Alors qu'en même temps tu update Titres => dans total tu gardes l'ancienne valeure de Titres ou bien la nouvelle que tu met à jour ? (désolé de répondre à ta question par une question n'ayant rien a voir
Pour ton truc, quelque chose du genre, ça fonctionne ? (dans le sens est ce que mysql veut bien de ce genre de syntaxe déjà ?
UPDATE t3 SET Titres=(SELECT sum(valorisation) FROM t2 WHERE membre_t2=t3.Membre), Total=Liquidites + Titres - Emprunt, Date = '$date_maj'
(sous requete = mysql 4.1 mini sinon s'même pas la peine)
- spidetra
- WRInaute passionné

- Messages: 1500
- Inscription: 7 Juil 2003
Deux petites règles perso :
1. Je ne met jamais une requête dans une boucle
2. Je préfére en premier une solution SQL à une solution PHP.
En appliquant ces deux règles à ton cas, une solution sans sous-requête.
1. Aggrégation
2. Mise à jour de la table t3 :
3. Suppression de la table temporaire
Je n'ai pas testé la solution avec sous-requête de FlorentP.
Il manque la clause WHERE du update;
La commande Update n'est pas compatible avec la clause GROUP BY, cela simplifierait la requête.
La syntaxe proposé me chatouille un peu, ya un truc qui me gêne.
Je sais pas la solution avec sous-requête il faudrait la creuser et la tester.
La solution que je te présente est moins élégante qu'une sous-requête. C'est une solution plus classique.
1. Je ne met jamais une requête dans une boucle
2. Je préfére en premier une solution SQL à une solution PHP.
En appliquant ces deux règles à ton cas, une solution sans sous-requête.
1. Aggrégation
- Code: Tout sélectionner
CREATE TEMPORARY TABLE tmp
SELECT ID, SUM(Valorisation)
FROM laTable1 LEFT JOIN laTable2
ON Membre_laTable1 = Membre_laTable2
GROUP BY ID
2. Mise à jour de la table t3 :
- Code: Tout sélectionner
UPDATE latable3, tmp
SET mise a jour des champs qui vont bien
WHERE membre=tmp.id;
3. Suppression de la table temporaire
- Code: Tout sélectionner
DROP TABLE tmp
Je n'ai pas testé la solution avec sous-requête de FlorentP.
Il manque la clause WHERE du update;
La commande Update n'est pas compatible avec la clause GROUP BY, cela simplifierait la requête.
La syntaxe proposé me chatouille un peu, ya un truc qui me gêne.
Je sais pas la solution avec sous-requête il faudrait la creuser et la tester.
La solution que je te présente est moins élégante qu'une sous-requête. C'est une solution plus classique.
- FlorentP
- WRInaute discret

- Messages: 145
- Inscription: 25 Juin 2005
Je n'ai pas testé la solution avec sous-requête de FlorentP.
Il manque la clause WHERE du update;
=> Ca le fait pour toutes les lignes
Après, faut savoir si c'est intelligent de toucher à toutes les lignes ou non, faudrait savoir ce qu'il y a dans la db et connaitre l'usage qu'il en est fait...
Il manque la clause WHERE du update;
=> Ca le fait pour toutes les lignes
Après, faut savoir si c'est intelligent de toucher à toutes les lignes ou non, faudrait savoir ce qu'il y a dans la db et connaitre l'usage qu'il en est fait...
- spidetra
- WRInaute passionné

- Messages: 1500
- Inscription: 7 Juil 2003
FlorentP a écrit:Je n'ai pas testé la solution avec sous-requête de FlorentP.
Il manque la clause WHERE du update;
=> Ca le fait pour toutes les lignes
Après, faut savoir si c'est intelligent de toucher à toutes les lignes ou non, faudrait savoir ce qu'il y a dans la db et connaitre l'usage qu'il en est fait...
Ce n'était pas une critique FlorentP
C'était juste pour dire que je proposais une autre solution, sans avoir tester la tienne.
Et tu as raison, sans connaître les structures des tables, et les besoins réels de mise à jour chaque solution est approximative.
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
FlorentP a écrit:Total = Liquidites + Titres - Emprunt
Alors qu'en même temps tu update Titres => dans total tu gardes l'ancienne valeure de Titres ou bien la nouvelle que tu met à jour ? (désolé de répondre à ta question par une question n'ayant rien a voir)
C'est la nouvelle que j'ai mise à jour, et qui recalcule le tout
FlorentP a écrit:Pour ton truc, quelque chose du genre, ça fonctionne ? (dans le sens est ce que mysql veut bien de ce genre de syntaxe déjà ?)
Lol oui... il met 7 secondes à gérer ca, mais il y arrive lol
FlorentP a écrit:UPDATE t3 SET Titres=(SELECT sum(valorisation) FROM t2 WHERE membre_t2=t3.Membre), Total=Liquidites + Titres - Emprunt, Date = '$date_maj'
Arf...j'ai jamais testé un select dans un update
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
spidetra a écrit:Deux petites règles perso :
1. Je ne met jamais une requête dans une boucle
2. Je préfére en premier une solution SQL à une solution PHP.
Je vais tester ca... mais sinon c'est vrai que c'est très moche une boucle PHP, et ca rame au possible surtout
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
FlorentP a écrit:Je n'ai pas testé la solution avec sous-requête de FlorentP.
Il manque la clause WHERE du update;
=> Ca le fait pour toutes les lignes
Après, faut savoir si c'est intelligent de toucher à toutes les lignes ou non, faudrait savoir ce qu'il y a dans la db et connaitre l'usage qu'il en est fait...
en gros toutes les lignes sont modifiées oui... mais si le SUM(truc) me ressort une valeur NULL (possible avec le LEFT JOIN), il faut que je transforme le NULL en 0 sinon ca plantouille
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
spidetra a écrit:Ce n'était pas une critique FlorentP
C'était juste pour dire que je proposais une autre solution, sans avoir tester la tienne.
Et tu as raison, sans connaître les structures des tables, et les besoins réels de mise à jour chaque solution est approximative.
Oui j'ai pas tout détaillé
Pour faire simple...
J'ai une table Cotation. Une table portefeuille. Et je dois recalculer le montant total des actions détenues par l'investisseur en récupérant le cours que je multiplie par les quantités. Et donc je recalcule le montant total
- spidetra
- WRInaute passionné

- Messages: 1500
- Inscription: 7 Juil 2003
finstreet a écrit:FlorentP a écrit:Je n'ai pas testé la solution avec sous-requête de FlorentP.
Il manque la clause WHERE du update;
=> Ca le fait pour toutes les lignes
Après, faut savoir si c'est intelligent de toucher à toutes les lignes ou non, faudrait savoir ce qu'il y a dans la db et connaitre l'usage qu'il en est fait...
en gros toutes les lignes sont modifiées oui... mais si le SUM(truc) me ressort une valeur NULL (possible avec le LEFT JOIN), il faut que je transforme le NULL en 0 sinon ca plantouille
Tu as la fonction COALESCE pour ça en SQL
Le SELECT devient :
- Code: Tout sélectionner
CREATE TEMPORARY TABLE tmp
SELECT ID, SUM(coalesce(Valorisation, 0))
FROM laTable1 LEFT JOIN laTable2
ON Membre_laTable1 = Membre_laTable2
GROUP BY ID
Tu as testé en passant par la table temporaire ?
- spidetra
- WRInaute passionné

- Messages: 1500
- Inscription: 7 Juil 2003
finstreet a écrit:non j'ai pas testé encore...je me réveille
par contre ce système d'update dans un select, je l'utilise 4 fois à la suite dans mon cron ... créer et détruire 4 tables de données, c pas risqué ?
les temporary table servent à ça. Je viens juste de relire le man, tu n'est pas obligé de faire le drop table. La table se supprimme automatiquement à la fin de la connection.
Je vois pas en quoi ça poserait un pb.
Tu re-optimize ta base régulièrement ?
Il est même possible de les créer uniquement en mémoire ( jamais testé )
http://dev.mysql.com/doc/refman/5.1/en/ ... ngine.html
Il est évident que si la solution en sous-requêtes est plus performante, il ne faut pas hésiter. C'est plus simple.
18 messages
• Page 1 sur 2 • 1, 2
Lectures recommandées sur ce thème :
- Question mysql : LEFT JOIN+COUNT
- MySQL problème de requete LEFT JOIN
- [Résolu] Optimisation de LEFT JOIN
- Update / Select et Mysql
- double left join
- [réglé]Reponse double dans une requête avec LEFT JOIN
- [Résolu] Mysql : Select avec un except
- Update de 2 tables MySql [RESOLU]
- Optimisation SQL - Inner Join (3) ou 3 x Select ?
- [MySQL] INNER JOIN qui retourne des valeurs par defaut
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités
