MYSQL:选择字段值的总和,同时选择唯一值?

时间:2013-06-10 16:59:38

标签: mysql sql join

我想计算每件商品的购买数量,同时根据查看内容的人数,显示用户是否购买了内容。因为物品和购买的数量可能会变得很大,所以我不愿意投入更多的JOINs来实现这一点,因为这看起来并不合适。

基本上,我希望在以下查询中的某个地方设置did_i_buy字段而不添加其他JOIN。这可能吗?让我们说user_name=tom

SELECT Items.item_id, item_name, COUNT(purchase_status='bought') as number_bought 
FROM Purchases
JOIN Items ON Purchases.item_id=Items.item_id
GROUP BY Items.item_id

这是我的数据库结构:

Table Items
item_id item_name
1           item_1
2           item_2
3           item_3

Table Purchases
item_id  purchase_status    user_name
1           bought          joe
2           bought          joe
1           bought          tom
1           bought          bill

tom

的预期结果
item_id item_name number_bought did_i_buy
1        item_1         3        yes
2        item_2         1        no

2 个答案:

答案 0 :(得分:3)

如果我理解正确,did_i_buy列意味着“汤姆买了”。你可以这样做:

SELECT
  Items.item_id,
  item_name,
  COUNT(CASE WHEN purchase_status='bought' THEN 1 END) as number_bought,
  MAX(CASE WHEN purchase_status='bought' AND user_name='Tom' THEN 'yes' ELSE 'no' END) AS did_i_buy
FROM Purchases
JOIN Items ON Purchases.item_id=Items.item_id
GROUP BY Items.item_id

或者(一个CASE声明,请参阅下面的评论)

SELECT
  Items.item_id,
  item_name,
  COUNT(purchase_status='bought') as number_bought,
  MAX(CASE WHEN user_name='Tom' THEN 'yes' ELSE 'no' END) AS did_i_buy
FROM Purchases
JOIN Items ON Purchases.item_id=Items.item_id
WHERE purchase_status='bought'
GROUP BY Items.item_id

还有一个调整:由于WHERE子句,COUNT只会看到行purchase_status='bought',所以检查状态的表达式可以省略(上面唯一的变化是第4行):

SELECT
  Items.item_id,
  item_name,
  COUNT(*) as number_bought,
  MAX(CASE WHEN user_name='Tom' THEN 'yes' ELSE 'no' END) AS did_i_buy
FROM Purchases
JOIN Items ON Purchases.item_id=Items.item_id
WHERE purchase_status='bought'
GROUP BY Items.item_id

答案 1 :(得分:0)

你必须(我认为)使用子查询。每个计数请求都是一个单独的查询,因此无法对此进行优化(除非将其全部压缩为一个带子查询的查询)。项目中的水平数据与购买中的垂直数据之间没有特殊关系。

以下是为用户计算交易的示例查询:

SELECT user_id,(SELECT count(*) FROM transactions WHERE buyer_id=u.user_id) as count FROM users as u

我对此查询与其他JOIN类型的类似查询进行了比较。结果:这一对0.0005对比0.0018 Ed Gibbs。但是,如果需要对number_bought(ORDER BY count DESC)进行排序,则后一查询要快得多。