我想计算每件商品的购买数量,同时根据查看内容的人数,显示用户是否购买了内容。因为物品和购买的数量可能会变得很大,所以我不愿意投入更多的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
答案 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)进行排序,则后一查询要快得多。