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 :

[Optimisation] Problème sur une requête UNION.


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 7
    Points
    7
    Par défaut [Optimisation] Problème sur une requête UNION.
    Bonjour à tous,

    j'ai cherché dans la doc MySQL et dnas la FAQ ici même, mais je n'ai pas trouvé d'élément de réponse à ma question qu ien fait est double.

    A savoir, je développe en Php (mais peu importe) un site sur lequel une recherche peut être faite sur plusieurs tables (en fait chaque vente, au sens une vente de plusieurs objets bien sûr, pas une vente d'un article = une table, c'est pas forcément top mais c'set pas de moi à la base), le problème vient du fait que les résultats doivent pouvoir être triés selon plusieurs critères.

    De ce fait, je ne peux pas afficher le jeu d'enregistrement de chauqe requête une par une. Je me suis donc mis ne tête de faire ça avec une requête UNION.

    Néanmoins; quand j'exécute celle-ci j'obtiens une erreur. Ma question est donc tout d'abord, voyez-vous d'où peut venir cette erreur?

    Ma requête :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    (
    SELECT numeroVendome, numeroDeLot, description, dateDeVente, lieuDeVente, commissairePriseur, estimationBasse, estimationHaute, prixDeVente
    FROM vente_16_12_04
    WHERE description LIKE "%bague%"
    AND Categorie LIKE UPPER(
    "%BIJOUX%"
    )
    )
    UNION ALL (
     
    SELECT numeroVendome, numeroDeLot, description, dateDeVente, lieuDeVente, commissairePriseur, estimationBasse, estimationHaute, prixDeVente
    FROM vente_20_12_04
    WHERE description LIKE "%bague%"
    AND Categorie LIKE UPPER(
    "%BIJOUX%"
    )
    )
    UNION ALL (
     
    SELECT numeroVendome, numeroDeLot, description, dateDeVente, lieuDeVente, commissairePriseur, estimationBasse, estimationHaute, prixDeVente
    FROM vente_10_10_04
    WHERE description LIKE "%bague%"
    AND Categorie LIKE UPPER(
    "%BIJOUX%"
    )
    )
    UNION ALL (
     
    SELECT numeroVendome, numeroDeLot, description, dateDeVente, lieuDeVente, commissairePriseur, estimationBasse, estimationHaute, prixDeVente
    FROM vente_12_10_041
    WHERE description LIKE "%bague%"
    AND Categorie LIKE UPPER(
    "%BIJOUX%"
    )
    )
    UNION ALL (
     
    SELECT numeroVendome, numeroDeLot, description, dateDeVente, lieuDeVente, commissairePriseur, estimationBasse, estimationHaute, prixDeVente
    FROM vente_12_10_042
    WHERE description LIKE "%bague%"
    AND Categorie LIKE UPPER(
    "%BIJOUX%"
    )
    )
    UNION ALL (
     
    SELECT numeroVendome, numeroDeLot, description, dateDeVente, lieuDeVente, commissairePriseur, estimationBasse, estimationHaute, prixDeVente
    FROM vente_01_06_05
    WHERE description LIKE "%bague%"
    AND Categorie LIKE UPPER(
    "%BIJOUX%"
    )
    )
    UNION ALL (
     
    SELECT numeroVendome, numeroDeLot, description, dateDeVente, lieuDeVente, commissairePriseur, estimationBasse, estimationHaute, prixDeVente
    FROM vente_13_06_05
    WHERE description LIKE "%bague%"
    AND Categorie LIKE UPPER(
    "%BIJOUX%"
    )
    )
    ORDER BY dateDeVente ASC
    L'erreur obtenue :
    #1064 - You have an error in your SQL syntax near '(SELECT numeroVendome, numeroDeLot, description, dateDeVente, lieuDeVente, commi' at line 1
    Ma seconde question est, est-ce la bonne solution niveau temps d'exécution de faire avec un UNION, faudrait-il mieux faire avec une table temporaire? (sachant que toutes les tables sur lesquelles je fais la recherche ont toutes la même structure) ou y a-t-il une autre solution encore?

    J'espère que mon problèmes vous parait clair (c'est pas sûr)et que vous saurez m'aider.

    Par avance, merci de me lire et de vos réponses.

  2. #2
    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
    Salut,

    1è remarque : Je te plains parce qu'une table par (jour de) vente, bonjour la modélisation Si la base avait été conçue de façon sensée, tu n'aurais pas tous ces problèmes d'UNION

    Pour l'erreur, c'est peut-être dû à ta version de MySQL (UNION n'est supporté qu'à partir de la 4.0).

    En ce qui concerne l'impact sur les performances, c'est un arbitrage à faire entre économie de trafic réseau (vu que la requête avec des UNION n'est envoyée et rapatriée qu'une fois) et économie de ressources sur le serveur (une requête UNION complexe peut prendre plus de temps à être analysée et exécutée que la somme des requêtes prises individuellement).
    Pensez au bouton

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Maximilian
    1è remarque : Je te plains parce qu'une table par (jour de) vente, bonjour la modélisation Si la base avait été conçue de façon sensée, tu n'aurais pas tous ces problèmes d'UNION
    Oui pour ça je le sais ne t'en fais pas, mais je reprends ce boulot longtemps après quelqu'un et je pense que dans son idée, ça devait être mieux pour les performances d'avoir une table de 1000 enregistrements plus une de 800 plutôt qu'une seule de 1800. Enfin j'imagine que c'es comme ça qu'il l'a pensée.

    Bref le fait est que les modifs sont trop bénignes pour que je refasse toutes la base (même si c'est pas l'envie qui m'en manque ).


    Citation Envoyé par Maximilian
    Pour l'erreur, c'est peut-être dû à ta version de MySQL (UNION n'est supporté qu'à partir de la 4.0).
    J'avais pensé à ça en lisant la doc MySQL mais la version de MySQL utilisée sur le serveur du site est la 4.0.24.


    Citation Envoyé par Maximilian
    En ce qui concerne l'impact sur les performances, c'est un arbitrage à faire entre économie de trafic réseau (vu que la requête avec des UNION n'est envoyée et rapatriée qu'une fois) et économie de ressources sur le serveur (une requête UNION complexe peut prendre plus de temps à être analysée et exécutée que la somme des requêtes prises individuellement).
    Ok merci, je vais essayé les deux solutions alors, enfin si je trouve la solution qui ferait fontcionner mon UNION.

    Si quelqu'un a une idée, je suis preneur .

    Merci de ton aide Maximilian.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    Par défaut
    En plus ta requete ne doit pas utiliser beaucoup les index si tu fais des like '%...' . Et notamment si tu fais un upper sur un champ. A moins d'avoir un index sur le upper du champ mais je suis pas sur que Mysql gere ce type d'index...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par gregory.broissard
    En plus ta requete ne doit pas utiliser beaucoup les index si tu fais des like '%...' . Et notamment si tu fais un upper sur un champ. A moins d'avoir un index sur le upper du champ mais je suis pas sur que Mysql gere ce type d'index...
    Ben c'est une recherche "multi critères", et ici, c'est sur une catégorie. Je devrais mettre ce champ catégorie en index?!

    Enfin ça change rien à mon problème de requête UNION

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous,

    voilà j'ai résolu mon problème, la requête UNION ne marchant pas, (peut-être est-ce dû à la version asez ancienne de MySQL du serveur : 4.0.24), je créé une table temporaire dans laquelle j'insère les résultats de ma sélection de chaque table, puis je sélecitonne mes enregistrements dans la table temporaire triés comme je le souhaite.

    Merci à tous pour votre aide et si besoin je peux détailler ma solution.

    Bonne journée.

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

Discussions similaires

  1. problème sur une requête imbriquée
    Par pbatty1 dans le forum Requêtes
    Réponses: 12
    Dernier message: 26/10/2007, 17h21
  2. problème sur une requête mysql
    Par atomikado dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/10/2007, 16h04
  3. Calcul de % sur une requête UNION ALL
    Par lodan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 08/03/2007, 14h20
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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