mysql - 查询列出一家商店的顾客,有两个不同的订单表

标签 mysql sql

我需要 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/

相关文章:

mysql - MYSQL查询中的where子句冲突

sql - 在 T-SQL 中查找企业当前是否营业

java - 如何防止12 :00:00 from becoming 00:00:00?

sql - SQL中的单引号和双引号有什么区别?

php - 从 iOS 应用程序安全地访问数据库

mysql - SQL Server聚合函数查询

mysql - 检索记录计数的更好方法

mysql join消除重复

sql - H2 数据库 - 使用 SQL 对列重新排序

mysql - 使用标准 SQL,如何制作带有顶级标题的报告?