2011-02-11 5 views
0

J'ai deux tables MySQL: une pour les articles et une autre pour enregistrer les achats. J'essaye de lister simplement chaque produit dans la table d'articles avec le nombre de fois qu'un utilisateur spécifique a acheté cet article. S'ils l'ont acheté 0 fois je voudrais qu'il liste encore l'article, mais dites 0. Ma requête actuelle semble exclure les enregistrements avec 0 achats.MySQL Count Query excluant les enregistrements lors de la jointure

Voilà ma requête en cours .. J'ai essayé GROUP BY i.item_id ainsi:

SELECT i.item_id, i.item_name, i.item_sku, i.item_price, COUNT(p.item_id) as purchase_count 
FROM items i 
LEFT OUTER JOIN purchases p 
ON p.item_id = i.item_id 
WHERE p.user_id = '1' 
GROUP BY p.item_id 
ORDER BY i.item_name ASC 

est ici la création de la table SQL:

CREATE TABLE `items` (
    `item_id` int(11) NOT NULL AUTO_INCREMENT, 
    `item_name` varchar(100) NOT NULL, 
    `item_sku` varchar(100) NOT NULL, 
    `item_price` decimal(19,4) NOT NULL, 
    PRIMARY KEY (`item_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 

INSERT INTO `items` VALUES(1, 'Item One', 'ITEM1', 99.9900); 
INSERT INTO `items` VALUES(2, 'Item Two', 'ITEM2', 19.9900); 
INSERT INTO `items` VALUES(3, 'Item Three', 'ITEM3', 10.9900); 
INSERT INTO `items` VALUES(4, 'Item Four', 'ITEM4', 4.9900); 

CREATE TABLE `purchases` (
    `purchase_id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    `item_id` int(11) NOT NULL, 
    `purchase_date` datetime NOT NULL, 
    PRIMARY KEY (`purchase_id`), 
    KEY `user_id` (`user_id`,`item_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

INSERT INTO `purchases` VALUES(1, 1, 1, '2011-02-01 12:01:38'); 
INSERT INTO `purchases` VALUES(2, 1, 2, '2011-01-03 12:01:45'); 
INSERT INTO `purchases` VALUES(3, 1, 1, '2011-02-08 12:02:17'); 

Merci pour toute aide! Je pensais que comme une jointure externe gauche, il afficherait tous les éléments.

Répondre

3

Vous aurez probablement besoin d'une sous-requête pour cela, comme avec votre requête actuelle la clause WHERE contraindra vos résultats aux lignes de la table d'achat où user_id = 1. Si vous supprimez la clause WHERE de votre requête, vous verrez ce que je veux dire.

Je vais mettre à jour ce moment avec du code pour prendre en charge une solution qui utilise une sous-requête.

MISE À JOUR Voici le code SQL que vous aurez besoin pour votre requête:

SELECT i.item_id, i.item_name, i.item_sku, i.item_price, 
(SELECT COUNT(*) FROM purchases where item_id=i.item_id and user_id='1') as purchase_count 
FROM items i 
ORDER BY i.item_name ASC 
+0

+1 pour ne pas utiliser JOIN, belle solution –

+0

Hey merci pour la répondre! Je vous en suis reconnaissant. Cela a du sens et fonctionne comme je le veux. Merci encore. – SqlSoul

0

MISE À JOUR

SELECT item_id, 
     item_name, 
     item_sku, 
     item_price, 
     IF(user_id != 1, 0, purchase_count) AS purchase_count 
FROM (SELECT i.*, 
      p.user_id, 
       COUNT(p.item_id) AS purchase_count 
     FROM items i 
       LEFT JOIN purchases p 
       ON p.item_id = i.item_id 
     GROUP BY i.item_id 
     ORDER BY i.item_name ASC) AS tbl