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

Requêtes MySQL Discussion :

Subquery returns more than 1 row


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut Subquery returns more than 1 row
    Bonjour,

    J'ai fais une requete assez "complexe" et la plus j'avance plus je bloque !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT user.*, SUM(thread.upload) AS tot, SUM(thread_mois.upload) AS mois, SUM(thread_lastm.upload) AS lastm FROM user
    LEFT JOIN thread AS thread ON (user.userid=thread.postuserid AND thread.postuserid=user.userid)
    LEFT JOIN thread AS thread_mois ON (user.userid=thread_mois.postuserid AND thread_mois.postuserid=user.userid AND (SELECT dateline FROM thread WHERE dateline>= " . $debut_mois . "))
    LEFT JOIN thread AS thread_lastm ON (user.userid=thread_lastm.postuserid AND thread_lastm.postuserid=user.userid AND (SELECT dateline FROM thread WHERE dateline>= " . $debut_lastm . " AND dateline<= " . $fin_lastm . "))
    GROUP BY user.userid
    ORDER BY tot DESC
    Mon erreur est a cause des deux AND (SELECT dateline...) !

    Voici l'erreur que me retourne MySQL:
    Subquery returns more than 1 row
    Si quelqu'un saurait me débloquer...

    Merci beaucoup,

    Cordialement,
    Mathieu.

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    En ajoutant LIMIT 1 dans me AND (Select...) ma requete fonctionne mais mon mois et tot et lastm sont doublés...

  3. #3
    Membre régulier Avatar de jp_rennes
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2006
    Messages : 72
    Points : 86
    Points
    86
    Par défaut pas sûr
    je me trompe peut être mais le probléme semble provenir de la sous requête :
    AND (SELECT dateline FROM thread WHERE dateline>= " . $debut_mois . ")

    As-tu essyé AND dateline IN (SELECT dateline FROM thread WHERE dateline>= " . $debut_mois . ").... ?

    Je ne suis pas sûr de mon coup n'ayant pas la base sous les yeux......

  4. #4
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Bonjour,

    Citation Envoyé par Dans les règles du forum il y
    Donnez les ordres SQL de création de vos tables (CREATE TABLE) et éventuellement les INSERT d'un jeu de données basique pour que tout un chacun puisse reproduire ce que vous voulez faire sur son SGBDR afin de mieux vous aider.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE MaTable
    (Col1 VARCHAR(128),
     Col2 INTEGER,
     Col3 DATE,
     Col4 CHAR(32),
     CONSTRAINT PK_MaTable PRIMARY KEY (COL1, COL2))
     
    INSERT INTO MaTable (COL1, COL2, COL3) 
    VALUES ('Un mot', 32, CURRENT_TIMESTAMP)
    INSERT INTO MaTable (COL1, COL2, COL3) 
    VALUES ('Deux maux', 0, NULL)
    présentez le résultat que vous voulez voir apparaître sous la forme d'une table.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -- Le résultat attendu :
    NOM     VILLE       NOMBRE 
    ------  ----------  ------ 
    MARTIN  PARIS            2 
    DUPOND  STRASBOURG       3
    ...

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Merci pour ta réponse jp_rennes->
    Column 'dateline' in IN/ALL/ANY subquery is ambiguous
    Maximilian je vous prepare ça alors !

    Merci à vous !

  6. #6
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Ma nouvelle requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT user.*, SUM(thread.upload) AS tot, SUM(thread_mois.upload) AS mois, SUM(thread_lastm.upload) AS lastm FROM user
    LEFT JOIN thread AS thread ON (user.userid=thread.postuserid AND thread.postuserid=user.userid)
    LEFT JOIN thread AS thread_mois ON (user.userid=thread_mois.postuserid AND thread_mois.postuserid=user.userid AND dateline IN (SELECT dateline FROM thread WHERE dateline>=" . $debut_mois . "))
    LEFT JOIN thread AS thread_lastm ON (user.userid=thread_lastm.postuserid AND thread_lastm.postuserid=user.userid AND dateline IN (SELECT dateline FROM thread WHERE dateline>=" . $debut_lastm . " AND dateline<=" . $fin_lastm . "))
    GROUP BY user.userid
    ORDER BY tot DESC
     
    $debut_mois: Date du debut du mois.
    $debut_lastm: Date du debut du mois dernier.
    $fin_lastm: Date de la fin du mois dernier.
    Cette requete me donne cette erreur:
    Column 'dateline' in IN/ALL/ANY subquery is ambiguous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE `user` (
    `userid` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `username` VARCHAR( 100 ) NOT NULL ,
    INDEX ( `username` )
    );
     
    CREATE TABLE thread
    (threadid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(250) NOT NULL,
    postuserid INT(10) UNSIGNED NOT NULL,
    dateline INT(10) UNSIGNED NOT NULL,
    upload INT(10),
    INDEX(postuserid), INDEX(dateline))
    Liens entre les 2 table -> user.userid=thread.postuserid

  7. #7
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    J'ai du mal à comprendre le but de cette triple auto-jointure

    Par ailleurs des conditions comme user.userid=thread.postuserid AND thread.postuserid=user.userid sont redondantes car les deux côtés sont équivalents.
    A=B <=> B=A...

  8. #8
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Enfaites la table thread contient des messages (contenus du message dans une table post liens postid=postuserid mais ça c'est autre choses )

    Donc le champ dateline c'est la date de l'envoi du thread !

    Et je voudrais recuperer dans la MÊME requete la somme du champ upload posté le mois dernier, ce mois-ci et tous, c'est-à-dire sans limite de temps !

  9. #9
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    On peut faire quelque chose de bien moins coûteux avec 3 requêtes (éventuellement regroupables avec des UNION) :

    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
    "SELECT user.*, SUM(upload) AS total
    FROM user
    LEFT JOIN thread ON user.userid=thread.postuserid
    GROUP BY user.userid
    ORDER BY total DESC"
     
    "SELECT user.*, SUM(upload) AS total_mois_dernier
    FROM user
    LEFT JOIN thread ON user.userid=thread.postuserid
    WHERE dateline>=" . $debut_lastm . " AND dateline<=" . $fin_lastm ."
    GROUP BY user.userid
    ORDER BY total_mois_dernier DESC"
     
    "SELECT user.*, SUM(upload) AS total_mois_courant
    FROM user
    LEFT JOIN thread ON user.userid=thread.postuserid
    WHERE dateline>=" . $debut_mois . "
    GROUP BY user.userid
    ORDER BY total_mois_courant DESC"
    Au passage les sous-requêtes étaient inutiles,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND dateline IN (SELECT dateline FROM thread WHERE dateline>=
    équivaut à


  10. #10
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Oui c'est ce que j'avais fais pour:
    Au passage les sous-requêtes étaient inutiles,

    AND dateline IN (SELECT dateline FROM thread WHERE dateline>=
    équivaut à
    AND dateline >=
    Mais on m'a conseiller de faire comme c'est maintenant !

    Le probleme dans ta requete c'est que je veux avoir qu'une seule requete et non 3 !
    Une solution ?

  11. #11
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Oui, avec des UNION comme je viens de te dire (MySQL >= 4.0 par contre).

    Ceci dit une requête ou 3, à moins que tes serveurs d'application et MySQL soient reliés par une connexion 56 k déplorable, c'est bonnet blanc et blanc bonnet.

  12. #12
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2004
    Messages : 185
    Points : 160
    Points
    160
    Par défaut
    Voila ma requete corriger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT user.*, SUM(thread.upload) AS tot, SUM(thread_mois.upload) AS mois, SUM(thread_lastm.upload) AS lastm FROM user
    LEFT JOIN thread AS thread ON (user.userid=thread.postuserid AND thread.postuserid=user.userid)
    LEFT JOIN thread AS thread_mois ON (user.userid=thread_mois.postuserid AND thread_mois.postuserid=user.userid AND thread_mois.dateline>= " . $debut_mois . ")
    LEFT JOIN thread AS thread_lastm ON (user.userid=thread_lastm.postuserid AND thread_lastm.postuserid=user.userid
    AND thread_lastm.dateline>= " . $debut_lastm . " AND thread_lastm.dateline<= " . $fin_lastm . ")
    GROUP BY user.userid
    ORDER BY tot DESC
    Non mais le probleme c'est que je peux fetch_array qu'une requete (j'ai une raison mais trop compliquer) donc si j'en fais 3 je pourrais en fetch_array qu'une et donc ça sert à rien ..

    Tu pourrais m'aider a faire l'union s'il-te-plaît ? Je ne l'ai jamais utiliser...

  13. #13
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Tu as juste à rajouter UNION entre chaque requête et ne mettre qu'un ORDER BY tout à la fin.

    http://dev.mysql.com/doc/refman/5.0/en/union.html

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 15/11/2007, 10h22
  2. #1242 - Subquery returns more than 1 row
    Par Loan26 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/11/2007, 20h32
  3. Réponses: 4
    Dernier message: 25/01/2007, 15h02
  4. Réponses: 3
    Dernier message: 08/12/2006, 17h28
  5. ORA-01427: single-row subquery returns more than one row
    Par hadid dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/10/2006, 15h35

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