Souhaitez-vous participer à la création d'un jeu vidéo inspiré de Stardew Valley, ou le tester lorsque la version bêta sera disponible ? Remplissez notre sondage ou inscrivez-vous à notre lettre d'information (en bas de page)
1

Requete SQL

le  2-06-2016 à 10:50 #
Salut à tous,

Voila ma requete SQL qui me permet d'afficher la liste des produits avec la personne qui l'a commandé et la date de commande entre le 1 Janvier 2015 et le 31 Décembre 2015 :

SELECT fk_product AS ID_DU_PRODUIT, label AS LE_PRODUIT, login AS A_ETE_COMMANDE_PAR, qty AS EN_QTE, COUNT( * ) AS NOMBRE_DE_FOIS, date_commande AS LE
FROM llx_commande_fournisseurdet, llx_commande_fournisseur, llx_user
WHERE llx_commande_fournisseur.rowid = llx_commande_fournisseurdet.fk_commande
AND llx_user.rowid = llx_commande_fournisseur.fk_user_author
AND fk_product <> 'NULL'
AND date_commande
BETWEEN "2015-01-01"
AND "2015-12-31"
GROUP BY 'fk_product', 'label', fk_user_author, qty, date_commande
ORDER BY llx_commande_fournisseur.date_commande ASC


Mon problème étant que je dois faire le même type de requête mais avec les produits non-commandés entre les mêmes dates.

Merci pour votre aide
Re: Requete SQL
le  2-06-2016 à 13:25 #
Salut,

Difficile sans connaitre la structure de ta bdd, mais ça devrait être quelque chose comme:

SELECT * FROM liste_de_tous_les_produits_existants WHERE fk_product NOT IN (SELECT DISTINCT fk_product FROM llx_commande_fournisseur WHERE date_commande BETWEEN "2015-01-01" AND "2015-12-31")

Les tables devraient bien sûr être indexées de façon à optimiser ce type de requête, pour éviter que ce soit trop lent.

Ben
Re: Requete SQL
le  2-06-2016 à 17:06 #
Salut ,
Merci pour ta réponse.

J'ai appliqué ta requête :

SELECT *
FROM llx_product
WHERE ref NOT IN (SELECT ref FROM llx_commande_fournisseur
WHERE date_commande BETWEEN "2015-01-01" AND "2015-12-31")

llx_product : liste de tous les produits
ref : référence du produit
Re: Requete SQL
le  2-06-2016 à 17:13 #
L'usage de DISTINCT n'est pas obligatoire, mais devrait avoir un effet sur l'espace mémoire et le nombre de cycles utilisés par la requête. Si les tables sont bien remplies ça pourrait avoir un impact.
Re: Requete SQL
le  3-06-2016 à 11:04 #
J'ai complété la requête afin de faire le lien entre le tables dans les jointures :

SELECT llx_product.rowid, llx_product.ref AS Ref_Dolibarr, date_commande AS Date_Commande, datec AS Date_Creation, llx_product.tms AS Date_Modif, llx_product.label AS Nom_Produit, price AS Prix_HT, price_ttc AS Prix_TTC, llx_product.tva_tx AS Taux_TVA
FROM llx_product, llx_commande_fournisseur, llx_commande_fournisseurdet
WHERE llx_commande_fournisseur.rowid = llx_commande_fournisseurdet.fk_commande
AND llx_commande_fournisseurdet.fk_product = llx_product.rowid
AND llx_product.ref NOT IN (SELECT ref FROM llx_commande_fournisseur
WHERE date_commande BETWEEN '2015-01-01' AND '2016-06-03')

Mais après quelques vérifications sur le tableau sorti, j'ai toujours les commandes effectuées entre le 1er janvier 2015 et le 3 Juin 2016 (j'ai étendu les dates)
J'ai peut-être mal utilisé le NOT IN ?


Ah non , autant pour moi
Le ref de llx_product n'est pas le même que celui de llx_commande_fournisseur
Les logiciels opensource sont tordus
Et je découvre la base de donnée

(Modifié par aide67 le 03-06-2016 à 11:10)
Re: Requete SQL
le  3-06-2016 à 14:54 #
Le préfixe fk signifie « foreign key », ce sont les liens vers une autre table.

J'ai trouvé la doc, peut-être quelque chose comme :

SELECT * FROM llx_product WHERE rowid NOT IN (SELECT DISTINCT fk_product FROM llx_commande_fournisseurdet, llx_commande_fournisseur WHERE WHERE llx_commande_fournisseur.rowid = llx_commande_fournisseurdet.fk_commande AND llx_commande_fournisseur.date_commande BETWEEN "2015-01-01" AND "2015-12-31")

Le mieux est de commencer par vérifier si la requête imbriquée donne bien la liste de tous les fk_product de l'année, après il suffit de les exclure.

(Modifié par ben le 03-06-2016 à 15:09)
Re: Requete SQL
le  9-06-2016 à 11:19 #
Salut,

Désolé j'ai complètement oublié de répondre

J'ai rajouté quelques jointures pour faire le lien entre les deux ref

Merci encore !




Ces discussions pourraient vous intéresser également:


requête formulaire
SQL - requête par date ...
REQUETE sql union all
[debutant ) requete mySQL
problème requete MySQL