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

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    octobre 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2007
    Messages : 255
    Points : 209
    Points
    209

    Par défaut Soucis pour récupération article avec condition spéciale

    Bonjour à tous

    Je suis en train de concevoir une requête dont le but est de récupérer 10 articles. La requête basique est simple à concevoir. Cependant, j'ai une condition spéciale mais là, je ne vois pas comment la rédiger.
    Je dispose d'une table Posts qui contient un titre, un sous-titre, un contenu, une image (url vers cette dernière), une catégorie (category_id), une ville (city_id).
    Je souhaiterais pouvoir récupérer les 10 derniers articles, mais qu'il n'y ait pas de doublons de ville. En gros, si j'ai dans ces 10 articles de base, 2 fois la même ville, que la second ville soit ignoré.
    Je pense que cela passe par les attributs distincts et/ou group by, mais là, impossible de trouver.
    Si dessous ma requête actuelle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM posts
    WHERE publish_date >= '2018-10-03 18:00:00'
    ORDER BY priority, publish_date DESC
    L'un de vous pourrait-il me donner un petit coup de main.
    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Responsable Datas
    Inscrit en
    janvier 2009
    Messages
    3 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Datas

    Informations forums :
    Inscription : janvier 2009
    Messages : 3 587
    Points : 7 857
    Points
    7 857

    Par défaut

    Bonjour,
    J'imagine que Post et Article se réfère en fait à la même table.
    Donc une piste: il ne faut pas récupérer un post s'il en existe un plus récent dans la même ville.

    Tatayo.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    octobre 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2007
    Messages : 255
    Points : 209
    Points
    209

    Par défaut

    Post est le terme anglophone de Article. Ma table est bien Posts.

    Je viens je pense de trouver:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM posts WHERE publish_date >= '2018-10-03 18:00:00' GROUP BY city_id ORDER BY `posts`.`city_id` ASC LIMIT 0, 10

  4. #4
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 917
    Points : 8 956
    Points
    8 956
    Billets dans le blog
    1

    Par défaut

    Select * ==> grosse erreur, à remplacer par les liste des colonnes UTILES au traitement
    Avec en plus un GROUP BY ==> deuxième erreur que seul MySQL autorise, ça n'a pas de sens de faire un GROUP BYsans cohérence avec les colonnes du SELECT

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 3 677
    Points : 11 287
    Points
    11 287

    Par défaut

    Salut à tous.

    Citation Envoyé par lemirandais
    Je souhaiterais pouvoir récupérer les 10 derniers articles
    Vous voulez dire les 10 articles les plus récents.
    Par votre demande, je comprends que vous recherchez pour une ville donnée, une et une seule ligne ayant la plus haute date de publication. Est-ce bien cela ?

    La solution que vous proposez ne fonctionne pas car en cas de doublon sur la plus haute date de publication, vous aurez plusieurs lignes et non une seule.

    Citation Envoyé par lemirandais
    mais qu'il n'y ait pas de doublons de ville
    Un "group by" sur la ville et votre problème est résolu.
    Sauf qu'en sélectionnant la ville, vous risquez d'avoir plusieurs doublons sur la date de publication.
    Pour cela, vous devez prendre l'identifiant le plus grand, sachant que vous recherchez la plus haute date de publication.

    Je vais partir de l'hypothèse que les identifiants de votre table posts sont croissants et dans le même sens que les dates de "publish_date", afin de simplifier le traitement.
    Autrement dit, si "publish_date ligne n+1" >= "publish_date ligne n" alors j'ai "id ligne n+1" > "id ligne n".

    Citation Envoyé par lemirandais
    Je pense que cela passe par les attributs distincts et/ou group by, mais là, impossible de trouver.
    En effet, c'est cela, sauf que le "distinct" se fait sur la totalité de ce que vous extrayez et non que sur une colonne.

    Par contre, vous n'avez pas indiqué la version MySql que vous utilisez.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select      t1.*
          from  posts as t1
    inner join  (    select  city_id,
                             max(id) as id
                       from  posts
                      where  publish_date >= '2018-10-03 18:00:00'
                   group by  city_id
                ) as t2
            on  t2.city_id = t1.city_id
           and  t2.id      = t1.id
      order by  t1.city_id
         limit 10;
    Ne sachant pas trop ce dont vous avez besoin comme colonnes, j'ai mis "*" mais normalement, vous devez mettre que les colonnes dont vous avez besoin.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    octobre 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2007
    Messages : 255
    Points : 209
    Points
    209

    Par défaut

    Citation Envoyé par escartefigue Voir le message
    Select * ==> grosse erreur, à remplacer par les liste des colonnes UTILES au traitement
    Avec en plus un GROUP BY ==> deuxième erreur que seul MySQL autorise, ça n'a pas de sens de faire un GROUP BYsans cohérence avec les colonnes du SELECT
    Bonjour

    Je cherchais à concevoir la requête en SQL pur afin de pouvoir après l'adapter à mon ORM (ORM de laravel).
    Il convient que je ne récupère que 4 des 10 champs de ma table (Uniquement les UTILES).
    Passez par un vrai requête SQL m'aide à visualiser le traitement et à l'apdater à mon ORM.

  7. #7
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    octobre 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2007
    Messages : 255
    Points : 209
    Points
    209

    Par défaut

    Citation Envoyé par Artemus24 Voir le message
    Salut à tous.


    Vous voulez dire les 10 articles les plus récents.
    Par votre demande, je comprends que vous recherchez pour une ville donnée, une et une seule ligne ayant la plus haute date de publication. Est-ce bien cela ?

    La solution que vous proposez ne fonctionne pas car en cas de doublon sur la plus haute date de publication, vous aurez plusieurs lignes et non une seule.


    Un "group by" sur la ville et votre problème est résolu.
    Sauf qu'en sélectionnant la ville, vous risquez d'avoir plusieurs doublons sur la date de publication.
    Pour cela, vous devez prendre l'identifiant le plus grand, sachant que vous recherchez la plus haute date de publication.

    Je vais partir de l'hypothèse que les identifiants de votre table posts sont croissants et dans le même sens que les dates de "publish_date", afin de simplifier le traitement.
    Autrement dit, si "publish_date ligne n+1" >= "publish_date ligne n" alors j'ai "id ligne n+1" > "id ligne n".


    En effet, c'est cela, sauf que le "distinct" se fait sur la totalité de ce que vous extrayez et non que sur une colonne.

    Par contre, vous n'avez pas indiqué la version MySql que vous utilisez.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select      t1.*
          from  posts as t1
    inner join  (    select  city_id,
                             max(id) as id
                       from  posts
                      where  publish_date >= '2018-10-03 18:00:00'
                   group by  city_id
                ) as t2
            on  t2.city_id = t1.city_id
           and  t2.id      = t1.id
      order by  t1.city_id
         limit 10;
    Ne sachant pas trop ce dont vous avez besoin comme colonnes, j'ai mis "*" mais normalement, vous devez mettre que les colonnes dont vous avez besoin.

    @+
    Je voulais sélectionner 10 articles maximum, mais que le résultat dans le résultat, je n'ai pas de doublons de ville (city_id).

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 3 677
    Points : 11 287
    Points
    11 287

    Par défaut

    Salut LeMirandais.

    Citation Envoyé par lemirandais
    Je voulais sélectionner 10 articles maximum, ...
    C'est ce que j'avais compris.

    Citation Envoyé par lemirandais
    mais que le résultat dans le résultat, je n'ai pas de doublons de ville (city_id).
    En effet, le but est de ne pas avoir de doublon.
    Or il existe un cas où un doublon peu apparaître, celui où la plus haute date de publication que vous avez sélectionné est multiple dans votre table.
    Avec mon astuce, vous ne récupérez qu'une et une seule ligne.

    L'avez-vous testé avec un jeu d'essai complet ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    octobre 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2007
    Messages : 255
    Points : 209
    Points
    209

    Par défaut

    A vrai dire, je n'ai pas encore trouvé le temps de tester car je suis pas mal occupé et il s'agit d'un projet non professionnel. Dans tous les cas, je testerais ta solution.

    Ma requête n'est pas provisoire, le temps qu'un nouveau module le remplace l'actuel complètement dépassé, d'ici 2/3 semaines.

  10. #10
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    18 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 18 295
    Points : 42 773
    Points
    42 773

    Par défaut

    Beaucoup plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH T AS
    (
    SELECT /* les bonnes colonnes */ ROW_NUMBER() OVER(PARTITION BY VILLE ORDER BY publish_date DESC) AS R
    FROM   posts
    )
    SELECT * 
    FROM   T
    WHERE  R = 1
    LIMIT  10
    Et pour apprendre le SQL, lisez mon livre :
    Nom : SQL.jpg
Affichages : 9
Taille : 47,4 Ko
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/01/2018, 18h51
  2. Réponses: 1
    Dernier message: 20/05/2014, 10h51
  3. Réponses: 1
    Dernier message: 15/08/2010, 17h03
  4. Souci pour désarchiver avec cpio
    Par vbcasimir dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 24/02/2006, 10h09

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