这是一个postgres数据库。我试图从品种表中拉出狗品种名称(Cane Corso,Labrador等),根据动物表中的外键显示。我的问题是动物表有两个外键到这个单一的品种表,我不断收到我的查询错误。第一个品种名称将根据左连接返回,但第二个品牌名称无法显示,因为我已经有一个左连接。以下是我试图做的简要概述:
breed table (ID, BreedName)
animal table (ID, breedID, breed2ID)
SELECT animal.ID, breed.BreedName FROM animal LEFT JOIN breed ON animal.breedID=breed.ID WHERE animal.ID='7';
我需要做的是让BreedName加入animal.breed2ID,我很失败。我可以轻松地对品种名称进行硬编码并将其显示在应用程序中,但这不利于数据库中品种名称的更改,添加或删除。
答案 0 :(得分:50)
在同一张桌子上再做一次连接:
SELECT animal.ID, breed1.BreedName as BreedName1, breed2.BreadName as BreadName2
FROM animal
LEFT JOIN breed as breed1 ON animal.breedID=breed1.ID
LEFT JOIN breed as breed2 ON animal.breedID=breed2.ID
WHERE animal.ID='7';
答案 1 :(得分:20)
虽然Ivan已经为您当前的数据库设计解决了您的问题,但长期考虑或仅仅是要学习的事情是让您的表设计更加规范化,以便每次添加品种时都必须添加新的连接对动物来说没有必要。通过这种简单的设计,你实际上使你的生活变得更加困难。
当您在实体上看到重复的属性类型时,在您的案例中,您应该开始闻到一些腐烂的东西,除了极少数情况。
在理想的设计下,您将执行以下操作。
1.保持你的品种。
2.使动物看起来像动物(animal_id,animal_name)。
3.添加一个新的animal_breed表。它看起来像这个animal_breed(animal_breed_id,animal_id,breed_id)。使用animal_bread_id是一个pk和一个唯一键(animal_id,breed_id),外键指向相应的表。
这种设计允许给定的动物接受一种或多种品种,而不必弄乱您的查询以返回多个品种。每当你有一个额外品种的动物时,你当前的设计就变成了一场噩梦。它有可能扼杀性能并使维护成为一场噩梦,最重要的是它不是合理的数据库设计。