MySQL:根据字段为0或1从2个不同的表中获取信息的特定查询

时间:2013-07-26 19:41:10

标签: mysql database

我认为这是一个非常常见的问题,可能是重复的,但我不知道如何搜索它。这是我的情景:我有3个表:寄存器,食物和食谱。表格结构简化:

寄存器

id | item_id |类型(0食品| 1食谱)

(item_id可以是食物ID或食谱ID)

食品

id |名字|重量

食谱

id |名字| num_ingredients

我想要的是查询寄存器表并根据类型字段为0或1返回食物或食谱名称(以及每个表中的一些特定字段,如食物中的重量和食谱中的num_ingredients)。

如果表格结构不是最好的,我会感谢帮助我找到最佳解决方案。 非常感谢。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

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

这几乎是一样的,但你不需要类型,它允许你做出适当的外键约束。

答案 1 :(得分:1)

您需要将两个详细信息表与UNION合并,然后使用JOINID字段将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回答UNION JOIN之后{{1}}可能会更好,因为它在加入之前不会创建一个大的临时表。