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 :

En une seule requête avoir X résultats avant tel ID et Y après


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 8
    Par défaut En une seule requête avoir X résultats avant tel ID et Y après
    Bonjour,

    j'ai donc une table, prenons pour exemple une table de news, chaque news à un ID, les ID ne se suivent pas forcement de 1 en 1 (= une news peut avoir été effacée), je voudrais en une seule requête avoir X résultats avant tel ID et Y après.

    Concrètement ça donne :

    soit la news d'ID = 9
    récupérer les 4 news dont les ID sont directement inférieurs à 9
    et les 8 news dont les ID sont directement supérieurs à 9


    En gros il s'agit de fusionner (enfin je crois)

    SELECT * FROM news WHERE ID < 9 LIMIT 0,4
    et
    SELECT * FROM news WHERE ID > 9 LIMIT 0,8


    est - ce que ça vous parait faisable ? ou alors autant faire 2 requêtes ?


    merci beaucoup !

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Tout d'abord, pourquoi SELECT * est à proscrire.
    Ensuite que penses-tu de cela
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select n1.id,COUNT(distinct n2.id) as inf, COUNT(distinct n3.id) as sup
    FROM news n1
    LEFT JOIN news n2 ON n1.id>= n2.id
    left join news n3 on n1.id<n3.id
    group by n1.id
    HAVING inf between 1 AND 5 ANd sup BETWEEN 1 AND 4
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Au temps pour moi, l'idée demande à être creusée.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Un petit tour en ville m'a permis de remettre mes idées en ordre (j'espère)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select n.id, count(*) as rang
    FROM news n
    LEFT JOIN news n2
    ON n.id <= n2.id
    GROUP BY n.id
    HAVING rang BETWEEN 
    (select count(*)
    FROM news n3 LEFT JOIN news n4 ON n3.id <= n4.id
    WHERE n3.id=$id)-4
    AND 
    (select count(*) 
    FROM news n5 LEFT JOIN news n6 ON n5.id <= n6.id
    WHERE n5.id=$id)+4
    ou $id est l'id d'offset.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 8
    Par défaut
    Woot, c'est parfait; merci beaucoup

  6. #6
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Personnellement, si ID est duement indéxé, je pense qu'il serait plus efficace de simplement passer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM news WHERE ID < 9 ORDER BY ID DESC LIMIT 0,4
    UNION ALL
    SELECT * FROM news WHERE ID > 9 ORDER BY ID ASC LIMIT 0,8

  7. #7
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Je suis bien d'accord, mais étant plongé dans le chapitre 5 de Learning PHP Data Object, j'y redécouvre que LIMIT n'est pas une syntaxe standard SQL.
    Du coup, traumatisé, j'ai du développer un réflexe pavlovien qui me fait chercher des solutions tarabiscotées pour contourner le recours à LIMIT.
    Mais, HAVING rang (où rang est un alias dans la clause SELECT) est-il standard ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  8. #8
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    C'est vrai que j'ai assez peu le nez dans les standards... Mais tous les SGBD ont un équivalent.

    Citation Envoyé par Maljuna Kris Voir le message
    Mais, HAVING rang (où rang est un alias dans la clause SELECT) est-il standard ?
    Je dirais que oui... au pire on doit pouvoir y mettre l'expression elle même. Je crois que HAVING est là pour ce genre de cas.

    Le problème des solutions à base de jointure est qu'elles obligent la base à lire à peu près toute la table... éventuellement plusieurs fois. Dans un cas où on a un index (comme ici), ce sera considérablement plus lent que le LIMIT qui va lire seulement la dizaine d'enregistrements concernés. Je serais curieux de voir de combien

  9. #9
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par Sivrît Voir le message
    Mais tous les SGBD ont un équivalent.
    Certes, mais la portabilité du code, avec une extension comme PDO, consiste à limiter les modifications à la chaîne de connexion.
    S'il faut étendre les classes PDO et PDOStatement pour y gérer tous les exotismes SQL, ça ne va pas être une sinécure.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

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

Discussions similaires

  1. Résultat de plusieurs semaines sur une seule requête
    Par chart dans le forum Requêtes
    Réponses: 9
    Dernier message: 29/07/2014, 17h35
  2. Réponses: 2
    Dernier message: 15/05/2014, 11h58
  3. Réponses: 19
    Dernier message: 30/07/2013, 16h43
  4. Comment faire pour avoir une seule requête ?
    Par abdo1966 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/04/2013, 11h53
  5. Insérer plusieurs enregistrements en une seule requête
    Par pyd001 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/02/2004, 10h38

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