2011-02-11 59 views
0

我有兩個MySQL表:一個用於物品,另一個用於記錄購買。我試圖簡單列出商品表中的每件商品以及特定用戶購買該商品的次數。如果他們購買了0次,我希望它仍然列出該項目,但是說出0.我目前的查詢似乎排除了0次購買的記錄。MySQL Count Query加入時不包含記錄

這裏是我當前的查詢。我已經試過GROUP BY i.item_id還有:

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 

下面是創建表的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'); 

感謝您的幫助!我認爲,作爲一個左外連接,它會顯示所有項目。

回答

3

您可能需要一個子查詢,因爲對於您當前的查詢,WHERE子句會將結果限制爲來自購買表的行,其中user_id = 1。如果從查詢中刪除WHERE子句,您將看到我的意思是。

我將用代碼立即更新以支持使用子查詢的解決方案。

UPDATE 下面是SQL代碼,您需要爲您的查詢:

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不使用加入,很好的解決方案 – 2011-02-11 18:43:06

0

UPDATE

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