MySQL Count Query在加入时不包括记录

时间:2011-02-11 18:16:00

标签: mysql count group-by

我有两个MySQL表:一个用于项目,另一个用于记录购买。我试图简单地列出项目表中的每个产品以及特定用户购买该项目的次数。如果他们已经购买了0次,我希望它仍然列出该项目,但是说0.我当前的查询似乎排除了0次购买的记录。

这是我当前的查询..我也试过了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');

感谢您的帮助!我认为这是一个左外连接,它会显示所有项目。

2 个答案:

答案 0 :(得分:4)

您可能需要一个子查询,与当前查询一样,WHERE子句会将结果约束到购买表中user_id = 1的行。如果从查询中删除WHERE子句,您将看到什么我的意思是。

我将使用代码暂时更新此内容,以支持使用子查询的解决方案。

<强>更新 以下是查询所需的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

答案 1 :(得分:0)

<强>更新

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