我需要 sql 帮助来查询: 我想创建一个 View 来列出商店的顾客。这是已进行 1 次或多次预订(表预订)或已进行 1 次或多次订购(表 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
所有对该 View 的查询都会被shop_id过滤,只显示具体店铺(即店铺管理区)的顾客。
并且只选择有预订或订单的客户 (num_reservations > 0 OR 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
。
关于mysql - 查询列出一家商店的顾客,有两个不同的订单表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16129954/