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 :

Regrouper plusieurs requêtes en une seule?


Sujet :

Requêtes MySQL

  1. #1
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut Regrouper plusieurs requêtes en une seule?
    Bonjour,
    Désirant optimiser les accès à ma base de données, je me demandais si c'était possible de le faire pour cette série de requêtes de façon à n'aboutir qu'à une seule requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT `newsid`,`newsdate`,`newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 2 ORDER BY `newsdate` DESC LIMIT 4;
     
    SELECT `newsid`,`newsdate`,`newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 5 ORDER BY `newsdate` DESC LIMIT 4;
     
    SELECT `newsid`,`newsdate`,`newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 4 ORDER BY `newsdate` DESC LIMIT 4;
     
    SELECT `newsid`,`newsdate`,`newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 3 ORDER BY `newsdate` DESC LIMIT 4;
     
    SELECT `newsid`,`newsdate`,`newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 7 ORDER BY `newsdate` DESC LIMIT 4;
     
    SELECT `newsid`,`newsdate`,`newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 8 ORDER BY `newsdate` DESC LIMIT 4;

  2. #2
    Membre averti
    Avatar de mohamed
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 217
    Points : 393
    Points
    393
    Par défaut
    Essaie d'utiliser les "union".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select .. from where ....
    union
    select .. from where ....
    union
    select .. from where ....
    order by .....
    Si j'ai paru trouver sans chercher c'est que j'ai longtemps cherché sans trouver!

    http://taslimanka.developpez.com

  3. #3
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Merci mais ça ne donne pas.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    J'ai parlé trop vite
    Il fallait metre ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SELECT `newsid`,`newsheadline`,`newsdate`,`surtitle`, `newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 2 ORDER BY `newsdate` DESC LIMIT 4) UNION (SELECT `newsid`,`newsheadline`,`newsdate`,`surtitle`, `newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 5 ORDER BY `newsdate` DESC LIMIT 4) UNION (SELECT `newsid`,`newsheadline`,`newsdate`,`surtitle`, `newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 4 ORDER BY `newsdate` DESC LIMIT 4) UNION (SELECT `newsid`,`newsheadline`,`newsdate`,`surtitle`, `newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 3 ORDER BY `newsdate` DESC LIMIT 4) UNION (SELECT `newsid`,`newsheadline`,`newsdate`,`surtitle`, `newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 7 ORDER BY `newsdate` DESC LIMIT 4) UNION (SELECT `newsid`,`newsheadline`,`newsdate`,`surtitle`, `newscat` FROM news WHERE `newsdate` <= '2007-07-24' and `newscat` = 8 ORDER BY `newsdate` DESC LIMIT 4)
    N'empêches, si quelqu'un a une autre solution, je suis preneur.

  5. #5
    Membre régulier
    Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juin 2004
    Messages : 88
    Points : 74
    Points
    74
    Par défaut
    Salut,

    pourquoi ne fais-tu pas plutôt pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `newsid`,`newsdate`,`newscat` FROM news WHERE `newsdate` <= '2007-07-24' AND `newscat` BETWEEN 2 AND 8 ORDER BY `newsdate` DESC LIMIT 4;
    et ensuite au niveau du traitement php tu sépare tes éléments?
    enfin c'est ce que j'aurais fais perso... pour 4 éléments le traitement sera plus rapide que les requêtes a mon avis.

    EDIT: non je viens de réfléchir ca ne peux pas marcher
    Ca sélectionnerais que les 4 premieres occurences trouvées, et pas au max 4 pour chaque valeur de newscat...
    peut etre avec une requete imbriquée mais c'est pas mon fort
    désolé

  6. #6
    Membre averti
    Avatar de mohamed
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 217
    Points : 393
    Points
    393
    Par défaut
    Ou aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `newsid`,`newsdate`,`newscat` FROM news WHERE `newsdate` <= '2007-07-24' AND `newscat` IN (2,5,4,3,7,8) ORDER BY `newsdate` DESC LIMIT 4;
    Par contre la requete de ddelec24 est plus optimale.
    Si j'ai paru trouver sans chercher c'est que j'ai longtemps cherché sans trouver!

    http://taslimanka.developpez.com

  7. #7
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    mohamed et ddelec24, vos requêtes ne sont pas fausses mais le résultat ne donne pas ce qu'il faut.

    J'ai en retour que des newscat = 2, pour l'instant il n'y a que la requête que j'ai trouvé comme solution qui fonctionne.

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    En fait, dans ce cas, il vaut peut-être mieux utiliser l'opérateur IN que l'opérateur BETWEEN, parce que, dans ton exemple, tu ne ramènes pas les lignes pour lesquelles newscat = 6 (si ça existe).
    Pour faire ça en une seule requête, essaie un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT `newsid`,`newsdate`,`newscat` 
    FROM news n1
    WHERE `newsdate` <= '2007-07-24' 
    AND newscat in (2, 3, 4, 5, 7, 8)
    AND 
    (SELECT count(*)
    FROM news n2
    WHERE n1.newscat = n2.newscat
    AND n1.newsdate < n2.newsdate) < 4
    order by newscat, newsdate
    J'ai pas testé... Mais ça doit être une solution de ce type là...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  9. #9
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    ced, je ne peux te répondre que par : cette requête me donne une belle plantation de can abis.

  10. #10
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Quelle version de MySQL ?
    Si c'est en-dessous de la 4.1, c'est cuit... Les requêtes imbriquées ne passent pas...
    Sinon, quel est le message d'erreur de la plantation ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  11. #11
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    C'est simple, la requête fais rouler le mysql à ne plus en finir avec des pics d'utilisation à 100% du processeur.
    Je n'ai pas laissé finir pour vérifier le temps que ça demandait, j'ai redémarré.

  12. #12
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    as tu un index sur le couple newsdate, newscat ?

  13. #13
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Je m'excuse si j'ai induit les amis en erreur. Vous remarquez qu'à ma première demande j'incluait uniquement `newsid`,`newsdate`,`newscat` en SELECT pour faciliter la lecture de ma requête. En fait, les colonnes dont j'ai besoin sont `newsid`,`newsheadline`,`newsdate`,`surtitle`, `newscat`.

    Ainsi, je ne peux me permettre de mettre des index sur toutes ces colonnes au vu de la structure de la table.

    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
    CREATE TABLE news (
      newsid int(11) NOT NULL auto_increment,
      newsheadline varchar(150) collate latin1_general_ci NOT NULL default '',
      newsbody text collate latin1_general_ci NOT NULL,
      newsdate date NOT NULL default '0000-00-00',
      newsauthor int(11) NOT NULL default '0',
      newscat int(11) NOT NULL default '0',
      newscomments tinyint(1) NOT NULL default '0',
      author varchar(50) collate latin1_general_ci NOT NULL default '',
      abstract text collate latin1_general_ci NOT NULL,
      photo varchar(200) collate latin1_general_ci NOT NULL default '',
      photoauthor varchar(50) collate latin1_general_ci NOT NULL default '',
      surtitle varchar(150) collate latin1_general_ci NOT NULL default '',
      exerg text collate latin1_general_ci NOT NULL,
      photolegend text collate latin1_general_ci NOT NULL,
      page tinyint(2) NOT NULL default '0',
      Art_Lu int(11) unsigned NOT NULL default '0',
      PRIMARY KEY  (newsid),
      KEY newsdate (newsdate)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/01/2014, 18h45
  2. [AC-2007] Regrouper plusieurs cellules dans une seule
    Par J_help dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/07/2009, 18h47
  3. [AC-2007] Plusieurs requêtes dans une seule liste déroulante
    Par Razorback dans le forum IHM
    Réponses: 5
    Dernier message: 29/04/2009, 14h09
  4. Regrouper plusieurs graphes sur une seule page
    Par Pur2000 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/12/2008, 11h53
  5. Regrouper 3 requêtes dans une seule
    Par LadyArwen dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/06/2003, 09h32

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