使用单独的表和LEFT JOIN进行继承:如何知道记录属于哪个子类

时间:2016-05-25 17:13:25

标签: mysql inheritance

我正在尝试使用这样的单独表来实现继承:

Animal (id, name, age)
Cat (id_animal, other fields related to cats)
Dog (id_animal, other fields related to dogs)

其中id_animal引用animal.id

我想知道在id给出记录的所有数据的最佳方法是什么。 现在我有这个问题:

SELECT * FROM animal
LEFT JOIN cat ON cat.id_animal = animal.id
LEFT JOIN dog ON dog.id_animal = animal.id
WHERE animal.id = 5

我得到了我需要的所有数据......但我不知道动物5是猫还是狗。事实上,我现在有几个具有相同属性的继承表因此我无法通过测试响应中的NULL列来获取动物的类型。

我还担心所有这些JOIN都会减慢我的申请速度。

那么什么是最佳解决方案?

  1. type中添加Animal列(并且可能会获得带有第一个SELECT的类型,并在相应的子表上获取与另一个SELECT相关的子类相关字段? )
  2. 其他
  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

在我看来,你的查询很好,并且它不会超级慢(考虑到你添加了索引,而你真的没有超级大表)。 '类型'可以通过以下方式生成。你不必为它准备一个专栏。

SELECT *, 
    IF(cat.id_animal IS NOT NULL, 'CAT', IF(dog.id_animal IS NOT NULL, 'DOG', 'NEITHER')) 
FROM animal
LEFT JOIN cat ON cat.id_animal = animal.id
LEFT JOIN dog ON dog.id_animal = animal.id
WHERE animal.id = 5

现在,结果表将包含相当多的NULL条目。另一种方法如下:

SELECT animal.*, 'CAT' type, concat(cat.col1, cat.col2, ...) detail 
FROM animal
JOIN cat ON cat.id_animal = animal.id
WHERE animal.id = 5
UNION
SELECT animal.*, 'DOG' type, concat(dog.col1, dog.col2, ...) detail 
FROM animal
JOIN dog ON dog.id_animal = animal.id
WHERE animal.id = 5