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

  1. #21
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ALL * , COUNT( c.id ) 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
    résultat :
    aaa_0000.jpg 8
    qqq_5555.jpg 2
    sdf_3522.jpg 0
    hau_2233.jpg 5

  2. #22
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 352
    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 352
    Billets dans le blog
    17
    Par défaut
    GROUP BY idimg <= Ceci est faux, il faut grouper par image, donc sur i.id

  3. #23
    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
    Ça sort tous les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ALL * , COUNT( c.id ) AS n
    FROM ori_images AS i
    LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY i.id
    ORDER BY i.id ASC
    Vraiment MERCI Séb! Je suis content. Vous avez eu une patience énorme pour moi!

    ça sort tout:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ALL * , COUNT( c.id ) AS n
    FROM ori_images AS i
    LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY i.id
    ORDER BY i.id ASC
    Merci Séb, vous avez été très généreux avec moi. MERCI!

    Je vais intégrer ça dans ma page.. je vais espérer que ça va
    bien rouler étant donné que j ai aussi le page par page dans
    la requête.
    ça devrait aller ca fonctionnait avant.

    La requête qui était ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ori_images ORDER BY id ASC LIMIT $ledebut,$nb_affichage_par_page
    est devenu ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ALL * , COUNT( c.id ) AS n
    FROM ori_images AS i
    LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY i.id
    ORDER BY i.id ASC $ledebut,$nb_affichage_par_page
    ça changé de quoi dans mon affichage.

    Le ID, le TITRE et la DESC des images ont changés pour ceux
    des commentaires. Je tente les ajustement. Si c'est concluant, je mets en résolu après.

    Si je pourrais mettre comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ligne['ori_image.titre']
    ?

  4. #24
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 352
    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 352
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY i.id ASC $ledebut,$nb_affichage_par_page
    Il manque la clause LIMIT.

    Le ID, le TITRE et la DESC des images ont changés pour ceux
    des commentaires. Je tente les ajustement.
    Parce que tes tables ont des champs de mêmes noms, ce qui n'est pas une bonne pratique.
    Regarde dans l'exemple donné dans mon 1er message, chaque champ a un nom unique

    Si je pourrais mettre comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ligne['ori_image.titre']
    ?
    Plutôt $ligne['i.titre'] à cause des AS de la jointure.

  5. #25
    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
    La solution des jointure fonctionnerait si mes champs des tables aurait été tous différents. J'ai en commun (id, titre et desc) dans mes deux tables. Il faudrait que je change à pas mal de place le code.

    Alors, je tests la première solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT( c.id ) AS n
    FROM ori_images AS i
    LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY i.id
    ORDER BY i.id ASC
    Affiche bien tous les nombre de commentaires.

    Mais, si j'ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ori_images SET img_id =
    qui devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE ori_image
    SET idimg =
    (SELECT COUNT( c.id ) AS n
    FROM ori_images AS i
    LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY i.id
    ORDER BY i.id ASC)
    J'obtiens le message suivant dans phpmyadmin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1093 - You can't specify target table 'ori_images' for update in FROM clause

  6. #26
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 352
    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 352
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par dancom5 Voir le message
    La solution des jointure fonctionnerait si mes champs des tables aurait été tous différents. J'ai en commun (id, titre et desc) dans mes deux tables. Il faudrait que je change à pas mal de place le code.
    Tu ne devrais pas avoir tant de scripts que ça à corriger.

    Alors, je tests la première solution:
    Mauvaise idée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ori_images SET img_id =
    qui devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE ori_image
    SET idimg =
    (SELECT COUNT( c.id ) AS n
    FROM ori_images AS i
    LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY i.id
    ORDER BY i.id ASC)
    Cela ne respecte pas ce que je t'avais donné dans mon 1er message.
    Il faut que tu reprennes ma requête et que tu l'adaptes à ta BdD, il n'y a rien (et surtout pas de jointure) à ajouter.

  7. #27
    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'ai beaucoup de fichier qui utilise les mêmes tables.

    J'essais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE ori_images
    SET img_id =
    (SELECT COUNT(*)
    FROM ori_comen
    WHERE idimg = id)
    mais je suis un peu perdu avec la clause where

    Le seul moyen d'afficher le nombre de commentaires avec les 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT( c.id ) AS n
    FROM ori_images AS i
    LEFT OUTER JOIN ori_comen AS c ON i.id = c.idimg
    GROUP BY i.id
    ORDER BY i.id ASC

  8. #28
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 352
    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 352
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE ori_images
    SET img_id = # Pourquoi changer l'identifiant de l'image ?
    (SELECT COUNT(*)
    FROM ori_comen
    WHERE idimg = id) # id est ambigu
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE ori_images
    SET nb_commentaires = # Champ nb_commentaires à créer
    (
        SELEC COUNT(*)
        FROM ori_commen
        WHERE ori_commen.idimg = ori_images.id
    )

  9. #29
    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
    Dans phpmyadmin, ça fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE ori_images
    SET img_id =
    (
        SELECT COUNT(*)
        FROM ori_comen
        WHERE ori_comen.idimg = ori_images.id
    )
    J'ai laissé img_id étant donné que ce champ est justement pour stocker les nombres.

    Je vais faire la version en PHP.. Merci Séb!

  10. #30
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 352
    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 352
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par dancom5 Voir le message
    J'ai laissé img_id étant donné que ce champ est justement pour stocker les nombres.
    Ah, pas sûr que le nom du champ soit bien choisi

  11. #31
    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
    F Séb!

    Fantastique!

    En plus, cette solution est simple. Rien à changer.

    J'ai appris quelque chose et ça va me servir dans le future.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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