8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai une requête MySQL qui calcul le stock de mon magasin. Les produits peuvent être unique, ou déclinés en plusieurs versions (taille, etc.).

Voici la requête actuelle :


				'
				SELECT SUM(count) AS count FROM
				((
					SELECT
						COUNT(id_product) AS count
					FROM
						widjoo_pro_activities_products T1
					WHERE
						T1.product_stock IS NOT NULL
				)
				UNION ALL
				(
					SELECT
						COUNT(T2.id_product) AS count
					FROM
						widjoo_pro_activities_products T1 INNER JOIN widjoo_pro_activities_products_declinations T2 ON T1.id_product = T2.id_product
					WHERE 
						T2.product_stock IS NOT NULL
				))
				temp
				'


J'aimerais que la première requête ne soit effective que s'il n'y a pas de déclinaison existante (sinon c'est comptabilisé en double), sans passer par PHP et éviter une boucle de tous les articles au préalable. Savez vous comment faire ?

J'ai bien essayé d'intégrer un IF, mais je ne suis pas très à l'aise avec ça ...


					SELECT
						IF(T2.id_activity = NULL, COUNT(id_product) AS count, 0 AS count)
					FROM
						widjoo_pro_activities_products T1 INNER JOIN widjoo_pro_activities_products_declinations T2 ON T1.id_product = T2.id_product


Merci d'avance Smiley smile
Modifié par Gaylord.P (22 Apr 2012 - 10:44)
Rebonjour à tous,

Je suis parvenu à progresser, je n'ai plus de message d'erreur mais je n'ai pas le bon résultat. Le soucis viens du IF et je me permets de vous donner la portion du code qui pose problème :

<?php
SELECT
	IF(T2.id_produit IS NULL, COUNT(T1.id_produit), 0) AS count
FROM
	produits T1 LEFT JOIN produits_declinaisons T2 ON T1.id_produit = T2.id_produit
WHERE
	T1.produit_stock IS NULL
?>


En fait, j'aimerais que le IF me retourne le COUNT si aucune déclinaison existe (donc T2.id_produit IS NULL), sinon 0 Smiley smile

Actuellement ça me retourne toujours vrai alors que ce n'est pas toujours le cas, savez vous d'ou peut venir le problème ?

Merci d'avance,
Gaylord.P. Smiley smile
C'est curieux que tu aies besoin du IF parce que a priori si T1.id_produit = T2.id_produit
alors T2.id_produit n'est jamais NULL ou alors T1.id_produit l'est et dans ce cas, COUNT renvoie déjà 0
COUNT.

Tu peux préciser concrètement ce que doit faire cette sous-requête ?
Salut et merci d'avoir répondu Smiley smile

En fait je souhaiterais tester, dans la requête MySQL, si il existe oui ou non des déclinaisons dans la table "produits_declinaisons".

J'ai donc fait une jointure LEFT JOIN et testant si, dans la table n°2, id_produit existait, en espérant que ça fonctionne. Mais non Smiley sweatdrop
OK, donc pour ce genre de chose pas besoin de sous-requête ni de IF.
SELECT table1.id, table2.id IS NULL AS existe
FROM table1
LEFT JOIN table2
    ON table2.id_produit=table1.id_produit
WHERE table1.machin='truc'

Cette requête renvoie la liste des id de table1 répondant la condition machin='truc' et existe vaut 1 si une correspondance dans table2 existe et 0 sinon.
Merci de ta réponse Smiley smile

Je connais ce procédé mais je pense avoir trop simplifié mon exemple, par rapport au code initial. Voici un bon exemple :

	'
	SELECT SUM(count) AS count FROM
	((
		SELECT
			IF(T2.id_produit IS NULL, COUNT(T1.id_produit), 0) AS count
		FROM
			produits T1 LEFT JOIN produits_declinaisons T2 ON T1.id_produit = T2.id_produit
		WHERE
			T1.produit_stock IS NULL
	)
	UNION ALL
	(
		SELECT
			COUNT(T2.id_produit) AS count
		FROM
			produits T1 INNER JOIN produits_declinaisons T2 ON T1.id_produit = T2.id_produit
		WHERE 
			T2.product_stock IS NOT NULL
	))
	temp
	'


On distingue deux requêtes ... et j'aimerais que la première requête ne soit exécuté que si il n'y a pas de déclinaisons ^^

Mais peut-être que c'est impossible Smiley decu
Bonjour à tous,

Après plusieurs recherches, je me suis aperçu qu'en fait, je me compliquais très très très largement la vie. Ou l'art de voir du complexe dans le facile, que même en archi-débutant aurait trouvé. Je ne sais pas comment j'en suis arrivé à tant me compliquer la vie.

La réponse est ici pour ceux qui arriveraient sur ce sujet pour un problème identique :

http://stackoverflow.com/questions/354002/mysql-select-where-not-in-table

Bonne journée Smiley smile