我正在尝试使用这样的单独表来实现继承:
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都会减慢我的申请速度。
那么什么是最佳解决方案?
type
中添加Animal
列(并且可能会获得带有第一个SELECT
的类型,并在相应的子表上获取与另一个SELECT
相关的子类相关字段? )谢谢!
答案 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