簡體   English   中英

MySQL-連接多個映射表並計算具有不同映射條件的記錄

[英]MySQL - join multiple mapped tables and count records with different mapping conditions

這是我嘗試編寫MySQL查詢的第三天。 進行了大量搜索,但仍無法按預期進行。 我會盡量簡化表格

系統有tkr_restaurants表:

restaurant_id | restaurant_name
1             | AA
2             | BB
3             | CC

每個餐廳都有一個分配的部門( tkr_divisions表):

division_id | restaurant_id | division_name
1           | 1             | AA-1
2           | 1             | AA-2
3           | 2             | BB-1

然后在tkr_meals_to_restaurants_divisions表中有飯菜,其中每餐都可以分配(映射)到整個餐廳和/或特定部門。 如果將餐點映射到餐廳,則所有餐廳的部門都應該看到它。 如果將膳食映射到部門,則只有特定部門才能看到。

meal_id | mapped_restaurant_id | mapped_division_id
1       | 1                    | NULL
2       | NULL                 | 1
3       | NULL                 | 2

我需要根據用戶權限顯示餐館列表和映射到它的飯菜數量。

示例1 :如果用戶有權訪問整個restaurant_id 1restaurant_3 (並且沒有特定的部門),則列表應為:

AA | 3
CC | 0

(因為用戶可以訪問映射到餐廳1及其所有部門的餐點,以及餐廳3及其所有部門的餐點(即使餐廳3沒有映射的部門/餐點))

示例2 :如果用戶僅有權訪問division_id 1 ,則列表應為:

AA | 1

(因為用戶只能訪問映射到部門1的餐點)。

我可以得到的最接近的查詢是:

范例1:

    SELECT *,
    (SELECT COUNT(DISTINCT meal_id) 
    FROM 
        tkr_meals_to_restaurants_divisions 
    WHERE 
 tkr_meals_to_restaurants_divisions.mapped_restaurant_id=tkr_restaurants.restaurant_id 
    OR tkr_meals_to_restaurants_divisions.mapped_division_id=tkr_divisions.division_id)AS total_meals
    FROM 
        tkr_restaurants 
    LEFT JOIN 
        tkr_divisions 
        ON tkr_restaurants.restaurant_id=tkr_divisions.restaurant_id 
    WHERE 
        tkr_restaurants.restaurant_id IN (1, 3) 
        OR tkr_restaurants.restaurant_id IN (
            SELECT restaurant_id 
            FROM tkr_divisions 
            WHERE division_id IN (NULL)
        ) 
    GROUP BY 
       tkr_restaurants.restaurant_id 
    ORDER BY 
        tkr_restaurants.restaurant_name

但是,結果是:

AA | 2
CC | 0

我相信這個查詢會讓我非常復雜,但是我寫的所有簡單查詢都產生了更加不准確的結果。

這個查詢呢:

SELECT 
FROM tkr_restaurants AS a 
JOIN tkr_divisions AS b 
ON a.restaurant_id = b.restaurant_id
LEFT OUTER JOIN tkr_meals_to_restaurants_divisions AS c 
ON (c.mapped_restaurant_id = a.restaurant_id OR c.mapped_division_id = b.division_id)

作為基礎四,您的進一步工作。 它將所有信息組合到一個表中。 如果添加例如:

WHERE a.restaurant_id IN (1, 3)

結果將是

| restaurant_id | restaurant_name | division_id | restaurant_id | division_name | meal_id | mapped_restaurant_id | mapped_division_id |
|---------------|-----------------|-------------|---------------|---------------|---------|----------------------|--------------------|
|             1 |              AA |           1 |             1 |          AA-1 |       1 |                    1 |             (null) |
|             1 |              AA |           2 |             1 |          AA-2 |       1 |                    1 |             (null) |
|             1 |              AA |           1 |             1 |          AA-1 |       2 |               (null) |                  1 |
|             1 |              AA |           2 |             1 |          AA-2 |       3 |               (null) |                  2 |

只需使用COUNT(DISTINCT c.meal_id)計算不同的餐ID,並以餐廳名稱獲取AA: 3您的示例2為3

我使用了sqlfiddle: http ://sqlfiddle.com/#!9 / fa2b78 / 18/0

[編輯]

JOIN tkr_divisions AS b更改為LEFT OUTER JOIN tkr_divisions AS b

SELECT *更改為SELECT a.restaurant_name, COUNT(DISTINCT c.meal_id)

最后添加一個GROUP BY a.restaurant_name

更新SQL Fiddle(新鏈接)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM