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 :

ID par groupe ne contenant pas certaines valeurs [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Points : 167
    Points
    167
    Par défaut ID par groupe ne contenant pas certaines valeurs
    Bonsoir/Bonjour,

    J'ai une table "detailcommande".
    Sur ma table "detailcommande", j'ai la colonne idCommande, article, quantite, etc... et statut.

    statut peut prendre dans l'ordre la valeur O pour non commandé --> C pour commandé --> R : pour reservé(ou prête) --> V pour vendu.

    Chaque ligne correspond à l'article commandé. Si dans une commande j'ai un article en R et un article en C ou O, la commande est considérée comme non prête( le statut le plus bas).

    Je ne sais pas comment m'y prendre dans ma requête pour obtenir la liste de commande pour un statut défini.

    J'ai commencé par ça pour chaque statut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idCommande, statut FROM detailcommande GROUP BY idCommande HAVING statut='o'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT idCommande, statut FROM detailcommande GROUP BY idCommande HAVING statut=c' AND statut<>'o'
    /* Ne doit pas contenir les commandes avec un article en O */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT  idCommande, statut FROM detailcommande GROUP BY idCommande HAVING  statut='r' AND statut<>'o' AND statut<>'c'
    /* Ne doit pas contenir les commandes avec un article en O et en C */
    Mais ce n'est pas tout à fait ce que je veux faire. Sachant qu'il faut éviter de faire trop de requêtes, il y a beaucoup de données.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Points : 336
    Points
    336
    Par défaut
    Bonjour,

    Tu souhaites regrouper les ID, tout en filtrant en fonction des statuts?

    Tu dis tes requêtes ne te donnent pas exactement ce que tu veux, or la première me semble correcte.

    Cordialement.
    Si débugger est l'art de corriger les bugs, alors programmer est l'art d'en créer.

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne comprends pas bien ce que tu fais : si statut='r' alors forcement il ne vaut ni 'o', ni 'c', ni 'z', ni 13083498
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    Oui, une liste d'ID (ou plutôt numéro de commande) dont le statut le plus bas correspond à ce que je cherche.

    Or, la première requête me retourne une liste d'ID des groupes contenant uniquement le statut o.

    L'ordre des statuts : o -> c -> r -> v

    En gros (o, (c, (r, (v))))

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Points : 336
    Points
    336
    Par défaut
    Bonjour.

    Ne serait-ce pas simplement ceci ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idCommande, statut FROM detailcommande GROUP BY idCommande
    Si débugger est l'art de corriger les bugs, alors programmer est l'art d'en créer.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Points : 167
    Points
    167
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Je ne comprends pas bien ce que tu fais : si statut='r' alors forcement il ne vaut ni 'o', ni 'c', ni 'z', ni 13083498
    Effectivement j'ai écrit l'opérateur '=' alors je je voudrais savoir comment je peux faire un 'contient'.

    PS : idCommande (identifiant de commande) n'est pas idDetailcommande (id de la ligne).

    Citation Envoyé par arthur57 Voir le message
    Bonjour.

    Ne serait-ce pas simplement ceci ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idCommande, statut FROM detailcommande GROUP BY idCommande
    Si je fais ça, il me sortira la liste complète des idCommande (y compris les commandes vendu), voir une Fatal Error limit memory ...
    D'autant plus que j'ai une table 'commande' pour avoir ce même id.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Points : 336
    Points
    336
    Par défaut
    Contient s'écrit avec un LIKE en SQL.

    Sinon si tu souhaites rajouter des filtres il te suffit de rajouter HAVING.

    Je ne vois pas très bien ce que tu souhaites de plus..
    Si débugger est l'art de corriger les bugs, alors programmer est l'art d'en créer.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Points : 167
    Points
    167
    Par défaut
    Citation Envoyé par arthur57 Voir le message
    Contient s'écrit avec un LIKE en SQL.
    Tu m'as donné une idée en disant ça !
    Voici pour la première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idCommande, statut, CONCAT(statut) FROM detailcommande GROUP BY idCommande HAVING CONCAT(statut) NOT LIKE '%o%' AND CONCAT(statut) LIKE '%c%'
    ça ressemble déjà à ce que je veux faire dans la première requête.

    Merci merci !

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT idCommande, statut FROM detailcommande
    WHERE statut = 'c'
    AND idCommande NOT IN (SELECT idCommande WHERE statut = 'o')
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Points : 336
    Points
    336
    Par défaut
    Le champ statut contient uniquement une lettre ou un mot ? Je te vois écrire 'o' une fois, et '%o%' une autre fois.
    Si débugger est l'art de corriger les bugs, alors programmer est l'art d'en créer.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Points : 167
    Points
    167
    Par défaut
    Citation Envoyé par sabotage Voir le message
    plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT idCommande, statut FROM detailcommande
    WHERE statut = 'c'
    AND idCommande NOT IN (SELECT idCommande WHERE statut = 'o')
    je ne suis pas fan des requêtes imbriquées de cette manière. Mais la solution dans ce cas se fait avec un disctinct. En plus, je ne suis plus obligé de sélectionner "statut" pour faire une close avec distinct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT idCommande FROM detailcommande WHERE  statut ='c' AND idCommande NOT IN (SELECT idCommande FROM detailcommande   WHERE statut = 'o')

    Citation Envoyé par arthur57 Voir le message
    Le champ statut contient uniquement une lettre ou un mot ? Je te vois écrire 'o' une fois, et '%o%' une autre fois.
    Le champ statut contient uniquement une lettre. J'ai utilisé un CONCAT(satut) qui concatène les lettre "a,b,c,d..." séparées par défaut par une virgule, donc une chaîne.


    Et pour les autres requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT idCommande FROM detailcommande WHERE statut = 'r'
    AND idCommande NOT IN (SELECT idCommande FROM detailcommande WHERE statut = 'o' OR statut = 'c')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT idCommande FROM detailcommande WHERE statut = 'v'
    AND idCommande NOT IN (SELECT idCommande FROM detailcommande WHERE  statut <> 'v')
    Et la 1ière tout simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT idCommande FROM detailcommande WHERE statut = 'o'
    ou plus gourmand
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idCommande, statut FROM detailcommande GROUP BY idCommande HAVING statut = 'o'
    En vous remerciant de m'avoir consacré un peu de temps.

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

Discussions similaires

  1. [XL-2007] seulement voir colonne contenant une certaine valeur.
    Par goats dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/10/2012, 21h18
  2. Réponses: 2
    Dernier message: 27/11/2009, 17h59
  3. Réponses: 9
    Dernier message: 25/06/2009, 13h51
  4. Insertion Apres une Cellule contenant une certaine valeur
    Par dec3003 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/03/2009, 17h39
  5. [POO] Variable ne contenant pas la valeur attendue
    Par norby042 dans le forum Langage
    Réponses: 5
    Dernier message: 09/11/2006, 10h06

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