簡體   English   中英

MySQL:根據字段為0或1從2個不同的表中獲取信息的特定查詢

[英]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與使用的寄存器表他們IDtype的字段。

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.

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