gpt4 book ai didi

mysql - 具有单独表和 LEFT JOIN 的继承 : how to know which subclass the record belongs to

转载 作者:行者123 更新时间:2023-11-29 20:58:17 25 4
gpt4 key购买 nike

我正在尝试使用单独的表来实现继承,如下所示:

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. 其他

谢谢!

最佳答案

在我看来,您的查询很好,并且不会 super 慢(考虑到您添加了索引,并且您实际上没有一个 super 大的表)。 “类型”可以通过以下方式生成。您不必为它建立一个专栏。

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

关于mysql - 具有单独表和 LEFT JOIN 的继承 : how to know which subclass the record belongs to,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com