我有两个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');
感谢您的帮助!我认为这是一个左外连接,它会显示所有项目。
答案 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