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

Langage SQL Discussion :

Récupération dernière occurrence dans une sous-requête


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Récupération dernière occurrence dans une sous-requête
    Bonjour!

    Je suis actuellement en train de transférer une grosse base de donnée (site marchand), et je dois créer le script qui écrira le fichier .csv pour transférer les produits

    Cependant, au moment d'inclure le prix des produits, il se trouve que les anciens prix ont été gardés dans la base de données, afin de garder un historique

    Mais du coup, je n'arrive pas a récupérer seulement le dernier prix, sachant que j'aimerais faire une seule requête, et non pas un script php appelant les id produits un par un, ce qui me semble moins optimisé (à voir, je me trompe peut être totalement! )

    Voici le début de ma requête (qui retourne tous les prix de chaque produit):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT A.product_id 'ID', A.product_publish 'active', A.product_name 'name', C.category_name 'categories', D.product_price
    FROM jos_vm_product as A
    LEFT JOIN jos_vm_product_category_xref B ON A.product_id = B.product_id AND main_category
    LEFT JOIN jos_vm_category C ON B.category_id = C.category_id
    LEFT JOIN jos_vm_product_price D ON D.product_id = A.product_id
    et un bout de code prometteur trouvé sur internet, à rajouter à la requête précédente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LEFT JOIN (SELECT MAX(mdate) 'tmpdat', product_id AS tmpid
    		FROM jos_vm_product_price S
    		GROUP BY 'tmpid') AS T ON A.product_id = tmpid AND D.mdate = 'tmpdat'
    Seulement, le tout me donne un product_price NULL...

    Donc voilà, je m'en remet à vous, ayant été incapable de trouver par moi même la solution

    Merci d'avance!!

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Si tous les produits ont un prix, alors vous pouvez faire une jointure de type "inner" vers les prix, en ajoutant un test de non existence (not exists) d'un prix plus récent pour l'article et le tour est joué

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Si le SGBD que tu utilises est conforme à la norme SQL, un mot encadré de guillemets simples n'est pas un nom de colonne mais une chaine de caractères.
    Est-ce que cela ne corrigerait pas ton problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LEFT JOIN (SELECT MAX(mdate) tmpdat, product_id
    		FROM jos_vm_product_price S
    		GROUP BY product_id) AS T 
        ON D.product_id = T.product_id AND D.mdate = T.tmpdat
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    cela me semble prometteur sur le papier

    Cependant, mon faible niveau en SQL (je n'utilise ce langage que depuis 2 mois) m'empêche de visualiser concrètement ce que vous me proposez

    Tous les produits ont minimum un prix, je le confirme

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    @al1_24: effectivement, ça a arrangé des choses!

    pas encore fonctionnel, mais au moins je ne suis plus coincé! je reviens si je retombe sur une impasse, ou si j'ai résolu mon problème

    EDIT: problème effectivement résolu! encore une erreur d'inattention

    en tout cas merci de l'aide!

    Au cas où, le code complet, simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT A.product_id 'ID', D.product_price 'price'
    FROM jos_vm_product as A
    LEFT JOIN (SELECT MAX(mdate) tmpdat, product_id AS tmpid
    		FROM jos_vm_product_price S
    		GROUP BY tmpid) AS T ON A.product_id = T.tmpid
    LEFT JOIN jos_vm_product_price D ON D.product_id = A.product_id
    AND D.mdate = tmpdat

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

Discussions similaires

  1. Order by dans une sous requête
    Par KRis dans le forum SQL
    Réponses: 7
    Dernier message: 31/10/2008, 15h29
  2. inserer un critere dans une sous requête
    Par Myogtha dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/02/2008, 16h53
  3. Passer un paramètre dans une sous-requête
    Par Lucier dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/10/2007, 10h07
  4. Contourner le non-support de limit dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/09/2007, 10h45
  5. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54

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