2013-04-21 104 views
1

我需要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個計數(*)。還有這兩個整個表格之間的聯合。

您是否認爲我可以測試更好的替代方法?

+0

什麼是樣本數據和期望的輸出? – 2013-04-21 10:09:12

回答

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 
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

+0

正在工作,但也發現性能問題:2個計數(*)和一個「有」,需要在整個用戶表中操作... – 2013-04-21 10:18:09

+0

增加了另一個版本,應該更快。 – sashkello 2013-04-21 10:20:37

+0

@sashkello。 。 。如果OP要按「shop_id」進行過濾,那麼也應該在'group by'子句中。用戶可能大概是不止一家商店的顧客。 – 2013-04-21 13:04:07

相關問題