IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

requête complexe SELECT et UPDATE 2 tables. [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut requête complexe SELECT et UPDATE 2 tables.
    Bonjour. Je dois construire une seule requête mysql de ce qui suit si possible:

    Il faut que je détermine le nombre de commentaire de idimg situé dans
    ori_comen et inscrire ce nombre dans la table ori_images à l'image à quoi il
    appartient.

    mon image 57 a 5 commentaires
    mon image 58 a 10 commentaires

    Ceci est ma tentative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE `ori_images` SET `img_id`='' WHERE 
    (SELECT COUNT(*) FROM `ori_comen` GROUP BY idimg)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    CREATE TABLE IF NOT EXISTS `ori_comen` (
      `id` int(4) NOT NULL auto_increment,
      `idimg` int(4) NOT NULL,
      `name` varchar(12) NOT NULL,
      `desc` text NOT NULL,
      `date` date NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=134 ;
     
    INSERT INTO `ori_comen` (`id`, `idimg`, `name`, `desc`, `date`) VALUES
    (133, 57, 'lenom', 'soncommentaire', '2011-05-12'),
     
    CREATE TABLE IF NOT EXISTS `ori_images` (
      `id` int(4) NOT NULL auto_increment,
      `img_id` int(4) NOT NULL,
      `titre` varchar(100) NOT NULL,
      `images` varchar(30) NOT NULL,
      `desc` varchar(500) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=64 ;
     
    INSERT INTO `ori_images` (`id`, `img_id`, `titre`, `images`, `desc`) VALUES
    (56, 0, 'titredelimage', 'aaa_0000.jpg', ' descriptiondelimage '),

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 319
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 319
    Billets dans le blog
    17
    Par défaut
    1. Il faudrait dans ta table images un champ contenant le nombre de commentaires
    2. Normalement tu ne devrais pas faire cela puisque tu peux obtenir facilement cette valeur avec une jointure

    Ex. :

    images
    ------------
    image_id
    image_titre
    image_commentaires # nbre de commentaires
    ...

    commentaires
    ------------
    commentaire_id
    commentaire_message
    commentaire_image # clef étrangère sur images.image_id
    ...

    Avec le champ image_commentaires :

    UPDATE images
    SET image_commentaires = (
    SELECT COUNT(*)
    FROM commentaires
    WHERE commentaire_image = image_id
    )


    Récupérer images et nbres de commentaires sans champ supplémentaire :

    SELECT ALL image_id, image_titre, COUNT(commentaire_id) AS commentaires_nb
    FROM images LEFT OUTER JOIN commentaires ON image_id = commentaire_image
    GROUP BY image_id

  3. #3
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Bonjour. Merci Séb pour l'aide. J'ai retenu la version jointure et je l'ai adapté à mon code. Le code fonctionne.

    J'obtiens le résultat souhaité pour le nombre mais un problème se pose,
    je n'arrive pas à intégrer ce nombre à chaque image incluant s'il n'y a pas
    de résultat donc 0.

    Ceci va afficher les images :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      $resultat = "SELECT * FROM ori_images ORDER BY id ASC";
      $result = mysqli_query($connexion,$resultat);
     
      while ($ligne = mysqli_fetch_assoc($result)){
        echo $ligne['images'].'<br>';
      }
    Affichage des commentaires qui devrait être à coté des images correspondantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	$res=$connexion->query("SELECT ALL *, COUNT(idimg) AS n
    		FROM ori_images AS i LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    		GROUP BY idimg ORDER BY i.id ASC");
    	while ($li = $res->fetch_object()){	
    		$nb = $li->n;
    		echo $nb;
    	}
    Je crois qu'il faut que je fasse une autre jointure pour que chaque image puisse avoir son nombre de commentaires.

    J'ai mis du temps pour faire des scénarios de tests et je ne vois pas comment.

    J'obtiens soit tous les nombres à toutes les images ou bien le dernier nombre à toutes les images. Un petit coup de main serait apprécié.

    Citation Envoyé par Séb. Voir le message
    2. Normalement tu ne devrais pas faire cela puisque tu peux obtenir facilement cette valeur avec une jointure
    Récupérer images et nbres de commentaires sans champ supplémentaire :
    SELECT ALL image_id, image_titre, COUNT(commentaire_id) AS commentaires_nb
    FROM images LEFT OUTER JOIN commentaires ON image_id = commentaire_image
    GROUP BY image_id

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 319
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 319
    Billets dans le blog
    17
    Par défaut
    SELECT ALL *, COUNT(idimg) AS n
    FROM ori_images AS i LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY idimg ORDER BY i.id ASC


    Ici il faut compter les commentaires (comme je l'ai fait plus haut) et pas les images, autrement t'auras toujours au moins 1.

  5. #5
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    J'obtiens que les images qui ont un commentaires dont le nombre est unique.

    Toutes les images présentes dans la base :
    aaa_0000.jpg 5
    qqq_5555.jpg 5
    sdf_3522.jpg 5
    hau_2233.jpg 5
    lar_8322.jpg 5
    ppp_3829.jpg 5
    sup_8392.jpg 5
    aaa_0002.jpg 5

    ici,il va afficher que le dernier nombre qui est le 5.

    Le 5 est si je fais la requête comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    		$res = "SELECT ALL *, COUNT(idimg) AS n
    FROM ori_images AS i LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY idimg ORDER BY i.id ASC";
     
    		$resu = mysqli_query($connexion,$res);
     
    		while ($ligne = mysqli_fetch_assoc($resu)){
    			//echo $ligne['n'].'<br>';
    			$in=$ligne['n'];
    		}
     
    		$resultat = "SELECT * FROM ori_images ORDER BY id ASC";
     
    		$result = mysqli_query($connexion,$resultat);
     
    		while ($ligne = mysqli_fetch_assoc($result)){
    			echo $ligne['images'].' '.$in.'<br>';
    		}
    J'obtiens ceci :
    aaa_0000.jpg 8 vrai
    qqq_5555.jpg 2 vrai
    sdf_3522.jpg 0 faux il affiche seulement une fois pour les 0
    hau_2233.jpg 5 vrai

    Si je fais ma requête ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		$res = "SELECT ALL *, COUNT(idimg) AS n
    FROM ori_images AS i LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY idimg ORDER BY i.id ASC";
     
    		$resu = mysqli_query($connexion,$res);
     
    		while ($ligne = mysqli_fetch_assoc($resu)){
    			echo $ligne['images'].' '.$ligne['n'].'<br>';
    		}
    Il ne veut pas afficher toutes les images si le nombre est identique d'une image à l'autre.

    Je veux afficher toutes les images avec leur nombre de commentaire
    même si c'est 0.

    Autrement dit, si j'ai 2 images qui ont le même nombre de commentaires,
    il va en affiché seulement une image avec le nombre.


    Citation Envoyé par Séb. Voir le message
    SELECT ALL *, COUNT(idimg) AS n
    FROM ori_images AS i LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY idimg ORDER BY i.id ASC


    Ici il faut compter les commentaires (comme je l'ai fait plus haut) et pas les images, autrement t'auras toujours au moins 1.

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 319
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 319
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par dancom5 Voir le message
    Je veux afficher toutes les images avec leur nombre de commentaire même si c'est 0.
    Il faut donc faire la même requête que celle que je t'ai indiquée. La tienne ne reprend pas le même principe, le idimg que j'avais écrit ci-dessus en rouge est incorrect.

    Remplace COUNT(idimg) par COUNT(<identifiant du commentaire>)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] requête mysql select 2 champs 2 tables
    Par mickeymic dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 28/05/2012, 15h42
  2. Requête avec select max sur 3 tables
    Par Tintinduweb dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/03/2010, 05h49
  3. Requête complexe avec plusieurs lignes par table
    Par Iwazaru dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/09/2009, 09h46
  4. [Requête SQL] - Select count avec plusieurs tables
    Par Pithonnette dans le forum SQL
    Réponses: 7
    Dernier message: 25/06/2009, 19h19
  5. Requête et sous requête avec SELECT et UPDATE
    Par Véronique75ca dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 29/06/2006, 21h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo