[英]MySQL: Specific query to obtain info from 2 different tables based of a field being 0 or 1
我想這是一個非常常見的問題,可能是重復的,但我不知道如何搜索它。 這是我的情景:我有3個表:寄存器,食物和食譜。 表格結構簡化:
id | item_id | 類型(0食品| 1食譜)
(item_id可以是食物ID或食譜ID)
id | 名字| 重量
id | 名字| num_ingredients
我想要的是查詢寄存器表並根據類型字段為0或1返回食物或食譜名稱(以及每個表中的一些特定字段,如食物中的重量和食譜中的num_ingredients)。
如果表格結構不是最好的,我會感謝幫助我找到最佳解決方案。 非常感謝提前。
你可以這樣做:
select r.id, r.type, f.name
from
Registers r
inner join Foods f on f.id = r.item_id and r.type = 0
union all
select r.id, r.type, c.name
from
Registers r
inner join Recipes c on c.id = r.item_id and r.type = 1
但是你的桌子結構並不理想。 首先,由於r.item_id可以包含來自兩個表的id,因此無法添加強制引用完整性的約束。 你需要一個觸發器來檢查它,這更復雜,更慢。
相反,我選擇以相反的方式建立關系:
將register_id添加到食物和食譜中。 然后,您可以像這樣編寫查詢:
select r.id, r.type, f.name
from
Registers r
inner join Foods f on f.register_id = r.id
union all
select r.id, r.type, c.name
from
Registers r
inner join Recipes c on c.register_id = r.id
這幾乎是一樣的,但你不需要類型,它允許你做出適當的外鍵約束。
您需要將兩個細節表,並結合UNION
,然后JOIN
與使用的寄存器表他們ID
和type
的字段。
SELECT item_id, name, data
FROM Registers r
JOIN (SELECT 0 type, id, name, weight as data
FROM Foods
UNION
SELECT 1 type, id, name, num_ingredients as data) x
ON r.item_id = x.id AND r.type = x.type
GolezTroi的回答是他在JOIN
之后進行UNION
可能會更好,因為它在加入之前不會創建一個大的臨時表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.