[RESOLU] Mise a jour de 2 tables en meme temps

Mammouth du PHP | 725 Messages

28 juin 2013, 17:27

Bonjour,

J'ai une table des albums et des chansons, je voudrais mettre a jour la table a chaque ecoute d'une chanson:
Table albums
id
album
total_play

Table chansons
id
id_album
chanson
play
au lieu de mettre ca:
// chansons
UPDATE chansons SET play = play + 1 WHERE id = id

// albums
UPDATE albums SET total_play = total_play + 1 WHERE id = id
Quand un visiteur ecoute une chanson, on doit incrementer le compteur de la chanson par 1 et aussi l'album de la chanson.

Merci a vous

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 juin 2013, 19:40

salut,


le seul moyen c'est de créer une vue modifiable mais je ne sais pas si c'est réalisable sur deux tables (l'update sur deux tables).

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 571 Messages

28 juin 2013, 19:46

bonjour,

total_play est un champ calculé(règle de modélisation) donc il est inutile de le sauvegarder dans une table car on peut déduire le total des chansons écoutés en faisant tout simplement une requête sql qui doit sommer les colonnes play:
select sum(play) from chansons;

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 juin 2013, 19:49

je pense plutôt qu'il veut un compteur d'écoute des chansons et non la somme de la durée des chanson.


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

28 juin 2013, 19:58

Et en ayant trois tables?
chansons id_chanson....
albums : id_album
albums_chansons id_chanson, id_album, nombre_passages_chanson
Il me semble qu'une requete assez simple donne facilement le nombre de passages d'une chanson
et une requete un peu plus complexe le nombre de passages d'un album en tenant compte des passages des chansons qu'il conient.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 juin 2013, 22:48

En fait juste le nombre de lecture des titres est suffisant un simple select sum(nbvue) from chanson where idalbum=412 suffit a avoir le nombre de vue total par album.

Après un sub select dans une requête plus globale fait l'affaire (ou une udf pour faire un peux plus clair ;) ).


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

29 juin 2013, 03:29

on peut le faire par SUM, mais je veux eviter une multitude de requetes dans une seule page, exemple de page:

Chanteur A
Album1: Nombre de chansons, nombre de lecture des chansons de cette album
Album2: Idem ici
Album3: Idem ici

Alors, au lieu de faire:
SELECT * FROM albums WHERE id_chanteur = id
//on affiche les donnees

SELECT SUM() FROM chansons ....
Je voudrais lors de la lecture d'une chanson, on met a jour l'album pour recuperer le nombre d'ecoute.

Eléphant du PHP | 190 Messages

29 juin 2013, 13:24

Salut,

Quelque chose dans ce style.
SELECT albums.id,albums.album, sum(chansons.play) AS total_play FROM albums
INNER JOIN chansons ON chansons.id_album = albums.id
WHERE id = id

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 juin 2013, 15:34

@Zahnzao : il faudrait un group by pour faire bien mais oui une solution

sinon
un select les champs albums, select count(*) from chanson where idalbum = ab.idalbum as nbtitre, select sum(nbvue) from chanson where idalbum = ab.idalbum as nbecoute, etc
from albums ab
@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

01 juil. 2013, 07:15

Je pense que j'etais mal comprise, au lieu de faire un SELECT SUM() pour afficher le total des ecoutes pour un album, je veux qu'a chaque fois une chanson est ecoutee on mets a jour l'album par une increentation de 1.

Au lieu de mettre
// on affiche les albums du chanteur
SELECT * FROM albums WHERE id_chanteur = id

// on calcule le total des ecoutes <====== Cette requete je veu l'eviter par la suivante
SELECT SUM() FROM chansons ....

UPDATE de l'album et de la chanson en meme temps (une seule requete)

Mammouth du PHP | 2278 Messages

01 juil. 2013, 11:56

Je crois au contraire que tout le monde a compris et estime qu'une bonne conception des tables éviterait cette double mise à jour.
Sans quoi, je ne vois pas où est le problème de mettre à jour deux tables successivement, éventuellement en bloquant une pendant qu'on met l'autre à jour
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 juil. 2013, 12:01

sino, comme indiqué en une seule requête tu peux le faire sur une vue (qui l'autorise).

ceci c'est effectivement un problème de conception que d'avoir une donnée redondante ;)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

02 juil. 2013, 01:43

je veux juste consulter s'il y a une methode que je connaissais pas, merci a vous