![](/img/trans.png)
[英]Join same tables to multiple tables, three different conditions. 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 1和restaurant_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.