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

Langage SQL Discussion :

COUNT en SQLite pour un débutant


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 4
    Points : 3
    Points
    3
    Par défaut COUNT en SQLite pour un débutant
    Bonsoir,
    Développeur confirmé Java, je débute en SQLite et je recherche depuis plusieurs heures maintenant à créer une requête que je pensai être simple

    J'ai 2 tables :
    une table A avec un id et un nom
    une table B avec un id et un aid

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    table A
    id                 nom
    -----              --------
    1                   n1
    2                   n2
    3                   n3
     
    table B
    id                 aid
    -----              --------
    1                   1
    2                   1  
    3                   3
    la but de ma requête est de me donner le nombre d'insertion dans la table B de chaque id de la table B, ma requête devrait me sortir les résultats suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    id                 nom                nombre
    -----            --------          -------
    1                   n1                2
    2                   n2                0
    3                   n3                1
    Qui pourrait m'aider sur le sujet? merci
    :-)

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    lisez ceci :
    http://sqlpro.developpez.com/cours/sqlaz/ensembles/
    La partie sur les group by

    Et ceci :
    http://sqlpro.developpez.com/cours/sqlaz/jointures/
    La partie sur les jointures externes

    Et si vous n'y arrivez pas avec ca, revenez avec vos essais

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Sqlite est une base de données type Access, c'est-à-dire fichier à plat ayant des possibilités de SQL.

    Les nouvelles versions après 3.6.3, je pense, assurent la gestion des clés étrangères.

    Sans être un spécialiste de cette base, une seule application significative, j'ai quelques notions qui vont pouvoir vous aider.

    Je ne vais pas répondre directement, mais j'ai construit un exemple en rapport avec votre demande. Sa lecture doit pouvoir vous aider.

    J'ai créé vos deux tables, mais en ajoutant une clé étrangère dans la table B. Nous avons :

    Table A(IdA, Nom)
    Table B(IdB, Aid, #IdA)
    IDA dans la table B est la clé étrangère qui reprend l'index de la table A.

    En reprenant vos données, j'ai établi la requête ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.IDA, Nom, COUNT(Aid)
    FROM A
      LEFT JOIN B ON B.IdA = A.IDA    
    GROUP BY A.IDA, Nom
    Le resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IdA	Nom	COUNT(Aid)
    1	N1	2
    2	N2	0
    3	N3	1
    Pour vous permettre de reproduire l'exemple, je vous joins le code pour créer les deux tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE [A] (
      [IdA] INTEGER NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK, 
      [Nom] NVARCHAR);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE [B] (
      [IdB] INTEGER NOT NULL PRIMARY KEY ON CONFLICT ROLLBACK, 
      [Aid] INTEGER, 
      [IdA] INTEGER NOT NULL CONSTRAINT [FK_1] REFERENCES [A]([IdA]) ON DELETE NO ACTION ON UPDATE NO ACTION);
    Il vous faut savoir que les instructions SQL ne semblent pas respecter rigoureusement la norme SQL92, sous réserve d'avis plus avertis que le mien sur ce sujet.

    Sans l'utilisation d'une clé étrangère, le décompte doit être possible avec une union des tables A et B. Je n'ai pas fait l'essai.

    Bon courage et A+

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Bel effort seabs mais il me semble que dans la structure donnée par Cyril_du_13, B.aid fait justement référence à l'identifiant de la table A !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour a tous,

    Citation Envoyé par punkoff Voir le message
    lisez ceci
    Je fréquente très peu les forum car j'essaye toujours au plus d'être autodidacte et d'apprendre par moi même j'avais donc bien déjà lu et relu ce tutorial.
    J'avais d'ailleurs réussi à avoir tout ce que je voulais mais jamais en une seule requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) AS nombre,id FROM B GROUP BY aid
    et
    pour le moment j'ai essayé plusieurs choses comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A.id, A.nom, COUNT(B.id) AS nombre
       FROM A,B
       GROUP BY A.id
     
    id                 nom                nombre
    -----            --------          -------
    1                   n1                3
    2                   n2                3
    3                   n3                3
    et ca:
    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
    SELECT id, nom, nombre
       FROM A, (
          SELECT COUNT(*) AS nombre, aid 
             FROM B
             GROUP BY aid
       )
     
    id                 nom                nombre
    -----            --------          -------
    1                   n1                2
    2                   n2                2
    3                   n3                2
    1                   n1                0
    2                   n2                0
    3                   n3                0
    1                   n1                1
    2                   n2                1
    3                   n3                1
    Je sais que SQLite peut être très différent de SQL donc j'essayai d'éviter les jointures. L'exemple qu'à fournit seabs (merci à lui) par exemple ne fonctionne pas. et renvoi 0 partout dans la colonne count...

    Je voulais savoir quelle est la méthode classique pour faire cela en SQL que je teste si elle marche en SQLite. Ca me dérangerai de devoir faire une requête en plus par A.id dans mon application pour savoir son nombre occurrence dans la table B

    FYI, voici mes créations de table si cela peut vous aider:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE A (
       id INTEGER PRIMARY KEY NOT NULL,
       nom TEXT NOT NULL
    );
     
    CREATE TABLE B (
       id INTEGER NOT NULL,
       aid INTEGER NOT NULL,
          FOREIGN KEY(aid)
          REFERENCES A(id)
    );
    :-)

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    vous auriez présentez la chose comme ca j'aurai développé beaucoup plus.

    Votre 2eme exemple avec une légère modification, ne fonctionne-t-il pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT id, nom, (
          SELECT COUNT(*) AS nombre, aid 
             FROM B
             WHERE A.Id = B.aid
       )
    FROM A
    (le group by devient inutile dans notre cas mais peut être est-il nécessaire pour SQLite)


    sinon il y a un sous-forum SQLite il me semble ici :
    http://www.developpez.net/forums/f15...s-sgbd/sqlite/

  7. #7
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    merci cela fonctionne comme cela le devrait, il s'agissait donc bien de requêtes imbriquées qu'il fallait utiliser mais l'imbrication était mal située et je comprend mieux d'ailleurs le fonctionnement que j'obtenais du coup.

    Merci encore de votre aide.

    Cyril
    :-)

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    J'ai modifié mes tables pour les accorder avec les tiennes. Ma requête devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.IDA, Nom, COUNT(Aid)
    FROM A
      LEFT JOIN B ON B.Aid = A.IDA    
    GROUP BY A.IDA, Nom
    et le résultat reste le même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IdA	Nom	COUNT(Aid)
    1	N1	2
    2	N2	0
    3	N3	1
    Si cela fonctionne chez moi, il n'y a aucune raison d'avoir des résultats erronés chez toi.

    J'ai fais mes essais avec Sqlite 3.7.6.2 et utilisé l'administrateur de bases Sqlite Expert version 3.3.22 Personal Edition qui est freeware.

    Pour les jointures, elles fonctionnent parfaitement avec SQlite. J'ai d'ailleurs développé une application de facturation avec bons de commande, lignes de produits, tarifs avec modifications régulières, etc. Sans utilisation des jointures, il m'aurait été impossible de conduire à son terme ce développement. Il est utilisé depuis plus de 2 ans en permanence, nous n'avons aucune anomalie.

    En fait, Sqlite accepte parfaitement les clés étrangères, ses faiblesses sont plutôt dans le contrôle de l'intégrité référentielle.

    Tu pourrais montrer le code ma requête chez toi, afin de voir pourquoi, elle retourne zéro dans la colonne Count.

    Edit - Complément

    Un essai avec la requête de @punkoff

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     SELECT idA, nom, 
      (SELECT COUNT(*) AS nombre FROM B WHERE B.Aid = A.IdA)
    FROM A
    Nous donne des résultats exacts

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IdA	Nom	(SELECT COUNT(*) AS nombre FROM B WHERE B.Aid = A.IdA)
    1	N1	2
    2	N2	0
    3	N3	1
    Edité le 19/07/2011 - Correction de quelques fautes

    A+

  9. #9
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    En effet seabs ta requête marche bien , la fois d'avant il y avait du avoir une confusion entre id et aid...
    et d'ailleurs je suis très dégouté car j'avais dejà fait cette requête lors de mes essais et je ne l'avais pas prise car au lieu de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT A.id, A.nom, COUNT(B.aid) AS nombre
    FROM A
      LEFT JOIN B ON B.aid = A.id    
      GROUP BY A.id
     
    id                 nom                nombre
    -----            --------          -------
    1                   n1                2
    2                   n2                0
    3                   n3                1
    J'avais mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A.id, A.nom, COUNT(B.aid) AS nombre
    FROM A
      INNER JOIN B ON B.aid = A.id    
      GROUP BY A.id
     
    id                 nom                nombre
    -----            --------          -------
    1                   n1                2
    3                   n3                1
    du coup j'avais écarté ce type de requêtes pensant que je n'aurai que les ids "communs" de A dans B...
    comme quoi les jointures ne sont vraiment pas comprises du tout dans mon cas
    :-)

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

Discussions similaires

  1. [WM17] SQLIte pour débutant
    Par PoloLeFou dans le forum Windev Mobile
    Réponses: 5
    Dernier message: 29/08/2013, 13h57
  2. [EDI CSS] un édietur CSS sympa pour un débutant
    Par java_fun dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 21/09/2005, 10h44
  3. De l'aide pour un débutant
    Par Abelkims dans le forum Débuter
    Réponses: 21
    Dernier message: 02/09/2005, 11h11
  4. De l'aide pour un débutant
    Par Abelkims dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 16/08/2005, 14h33
  5. Requete pour un débutant
    Par sqlnoob dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/05/2005, 08h55

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