查询列出一个商店的客户,有两个不同的订单表
我需要sql帮助查询: 我想创建一个视图来列出一个商店的客户。这是选择了一个或多个预订(表预订)或已经完成一个或多个预订(餐桌shop_orders)的用户表。查询列出一个商店的客户,有两个不同的订单表
------------- --------------
| users: | | shops: |
------------- --------------
| id (PK) | | id (PK) |
------------- --------------
------------------ ----------------
| reservations: | | shops_orders:|
------------------ ----------------
| id (PK) | | id (PK) |
| user_id (FK) | | user_id (FK) |
| shop_id (FK) | | shop_id (FK) |
------------------ ----------------
这是我的出发点工作确定:
SELECT u.*,
r.shop_id,
(SELECT count(*)
FROM reservations r
WHERE r.user_id = u.id) AS num_reservations,
(SELECT count(*)
FROM shop_orders so
WHERE so.user_id = u.id) AS num_orders
FROM users u
INNER JOIN (SELECT r.user_id,
r.shop_id
FROM reservations r
UNION
SELECT so.user_id,
so.shop_id
FROM shop_orders so) AS r ON u.id = r.user_id
GROUP BY u.id
所有查询这一观点将被shop_id进行过滤,只显示一个具体店铺的客户(被店铺管理区域) 。
且只有已经预订或订单客户选择(num_reservations> 0或NUM_ORDERS> 0)
我觉得这个问题是性能:从整个表2个计数(*)。还有这两个整个表格之间的联合。
您是否认为我可以测试更好的替代方法?
你可以这样说:
SELECT
u.*,
r.shop_id,
IFNULL(COUNT(DISTINCT r.id), 0) AS num_reservations,
IFNULL(COUNT(DISTINCT o.id), 0) AS num_orders
FROM users u
LEFT JOIN reservarions r ON r.user_id = u.id
LEFT JOIN shop_orders o ON o.user_id = u.id
GROUP BY u.id
HAVING num_reservations + num_orders > 0
另一种方式,应该是更快:
SELECT
u.*,
r.shop_id,
IFNULL(COUNT(DISTINCT r.id), 0) AS num_reservations,
IFNULL(COUNT(DISTINCT o.id), 0) AS num_orders
FROM users u
LEFT JOIN reservarions r ON r.user_id = u.id
LEFT JOIN shop_orders o ON o.user_id = u.id
WHERE r.id IS NOT NULL OR o.id IS NOT NULL
GROUP BY u.id
如果你需要把它拆分通过他们使用的用户和卖场,做GROUP BY u.id, r.shop_id
。
正在工作,但也发现性能问题:2个计数(*)和一个“有”,需要在整个用户表中操作... – 2013-04-21 10:18:09
增加了另一个版本,应该更快。 – sashkello 2013-04-21 10:20:37
@sashkello。 。 。如果OP要按“shop_id”进行过滤,那么也应该在'group by'子句中。用户可能大概是不止一家商店的顾客。 – 2013-04-21 13:04:07
什么是样本数据和期望的输出? – 2013-04-21 10:09:12