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 :

select * ou select count(*) ou select count(id)


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    wjc
    wjc est déconnecté
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Par défaut select * ou select count(*) ou select count(id)
    Bonjour,

    Après avoir regardé la faq et fait une recherche sur le cette catégorie du forum je me permet de poser cette question de newbie.

    Je dois effectuer une requête sur une table pour vérifier si un enregistrement existe.

    Schéma de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE `article` (
      `id` int(11) NOT NULL auto_increment,
    ...... etc etc
      `reference` varchar(10) NOT NULL default '',
      PRIMARY KEY  (`id`),
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from article where reference='".$reference."'
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from article where reference='".$reference."'
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(id) from article where reference='".$reference."'
    ou autre ?

    Je n'ai pas besoin de récupérer la valeur de id mais juste savoir si l'enregistrement existe.
    Laquelle de cette requête (ou une autre) est la plus rapide, idéale?

    Merci

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Ta question vaste (on peut y répondre de nombreuses façons différentes suivant le contexte, j'y reviendrai peut-être plus tard).

    C'est pour faire quoi exactement? Une vérification avant INSERT?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    pcaboche >> + 1

    Pour vérifier l'existence il y a le prédicat EXISTS qui a la bonne idée de s'arrêter à la première occurrence au lieu de les compter toutes.

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par Médiat
    pcaboche >> + 1
    Ca, je ne comprends pas ce que cela veux dire. Je l'interprête comme étant du code C: "décalage du bit d'une position vers la droite", ce qui revient à faire une division par 2. Pas sympa de me couper en 2 comme cela... Plus sérieusement, cela veux dire quoi?

    Sinon, on peut faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id
    FROM matable
    WHERE reference='$reference'
    LIMIT 1
    Comme ça:
    - ça limite à 1 enregistrement
    - on récupère l'id au passage (ça peut être pratique)

    Pour l'insertion, on peut faire un INSERT IGNORE TABLE matable... comme ça si l'enregistrement existe déjà, l'erreur est ignorée (un peu crade quand même...)

    Pour mettre à jour des données, on fait un: REPLACE, qui se comporte comme un INSERT si l'enregistrement existe déjà (ça évite de faire un "si EXISTS alors UPDATE sinon INSERT": comme ça on fait la modification en 1 requête seulement !).

    Voilà pourquoi je demandais de détailler un peu la question.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Citation Envoyé par pcaboche
    Citation Envoyé par Médiat
    pcaboche >> + 1
    Ca, je ne comprends pas ce que cela veux dire. Je l'interprête comme étant du code C: "décalage du bit d'une position vers la droite", ce qui revient à faire une division par 2. Pas sympa de me couper en 2 comme cela... Plus sérieusement, cela veux dire quoi?
    Que je suis d'accord avec toi

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Ok, merci Médiat, je ne savais pas.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    wjc
    wjc est déconnecté
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Par défaut
    oui c pour eviter de faire un insert avec plein de contrôles qui suivent pour insérer les autres données dans kes autres champs

    Quelle syntaxe est la plus appropriée donc ?

    merci pour vos réponses

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par wjc
    Quelle syntaxe est la plus appropriée donc ?
    La encore, c'est super vague ! Ca dépend de ca que tu veux faire.

    A propos du REPLACE, voici un extrait de la doc MySQL:
    REPLACE fonctionne exactement comme INSERT, sauf que si une vieille ligne dans la table à la même valeur qu'une nouvelle pour un index UNIQUE ou une PRIMARY KEY, la vielle ligne sera effacée avant que la nouvelle ne soit insérée.
    Donc, à priori, si ta référence est UNIQUE (ce n'est pas le cas dans ta table, mais peut-être que dans ton problème ça l'est, sinon comment tu identifies un objet particulier en se basant juste sur la référence?) alors le REPLACE pourrait convenir (insertion si pas dans table, sinon, remplacement des données)

    Autre détail important (toujours dans la doc):
    Quand vous utilisez une commande REPLACE, mysql_affected_rows() retournera 2 si une nouvelle ligne en remplace une existante, et cela parce qu'il y aura eu une insertion puis une suppression.

    Cela aide à savoir si REPLACE a ajouté ou a remplacé une ligne : Testez si le nombre de lignes affectées est égal à 1 (ajout) ou s'il est égal à 2 (remplacement).
    On se rapproche de ce que tu veux faire?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  9. #9
    wjc
    wjc est déconnecté
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Par défaut
    En fait je n'ai pas besoin que vous preniez en compte l'insert ou l'update dans la table.
    J'ai vraiment juste besoin de savoir quelle fontion est la plus rapide pour juste vérifier la présence de l'entrée dans la base.

    Je ne sais pas ce qu'il faut que je vous donne comme info supplémentaire le référence est à priopri unique donc le limit 1 est donc il est clair utile içi.

    Je pensais qu'il existait que les 3 solutions que j'ai donné au dessus pour se faire. Je vois que je me suis trompé

  10. #10
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Bon ben s'il n'y a que ça, ton problème est résolu !
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  11. #11
    wjc
    wjc est déconnecté
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Par défaut
    donc j'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id
    FROM matable
    WHERE reference='$reference'
    LIMIT 1
    :

  12. #12
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Ben à priori oui...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  13. #13
    wjc
    wjc est déconnecté
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 56
    Par défaut
    Merci

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

Discussions similaires

  1. Perf pour chercher existence : count ou select ?
    Par eprevot dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/12/2011, 18h21
  2. [MySQL] Requête Count dans Select
    Par Phrederik dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 06/11/2011, 22h26
  3. Select sur 3 tables et 2 count()
    Par RobertVonTagada dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/10/2006, 13h32
  4. Réponses: 9
    Dernier message: 29/05/2006, 14h30
  5. Recupération des selections sur une DBGrille multi Selection
    Par Andry dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/11/2004, 11h43

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