我有一张桌子(让我们称之为ITEMS)并且它有#34;绑定"其他表的数量(让我们说:两个,鞋子和衬衫)。我的意思是" bind" - 当我在这两个表中的一个表中插入一个新行时,我还向表ITEMS插入一行。表SHOES / SHIRTS中的新行有一个字段,表示它对应的ITEM。
ITEMS
id
21
22
23
SHOES
id name size item_id
1 foo 42 21
2 bar 40 23
SHIRTS
id name size length item_id
1 abc XXL 50 22
所以,让我们假设我知道其中一个ITEMS的值id(例如id = 22),我想从数据库中获取有关此项目的所有信息。
我尝试select * from shoes where item_id = 22 union select * from shirts where item_id =22
并使其工作我添加了选择其他列,以确保数量和类型都很好。这些附加列具有默认值,我使我的Java应用程序忽略这些结果,它工作不知何故,但我觉得这太硬了;除了它适用于两列,但可能有更多的列,而不仅仅是这两列。这就是为什么我问你,Stack Overflow - 我怎么能SELECT * FROM All tables WHERE item_id = 22
?
修改
我尝试了JOIN,使用JOIN我的结果看起来像是ITEMS-JOINED SHOES-JOINED SHIRT和零行。 LEFT JOIN可能是答案,但我仍然不知道如何以编程方式选择何时选择SHIRTS.
*或SHOES.*
。
答案 0 :(得分:2)
此帖子不是您原始问题的答案,而是对您上次评论的回复。
关系数据库基于实体之间的关系。关系可以是一对一,一对多等等。在您的情况下,项是一个实体,可以在所有产品类型中共享许多共同属性,例如价格,生产商,供应商,数量,性别等。 Shoe 在这种情况下仅是该实体的产品类型属性。这种方法只会帮助您消除您现在遇到的问题,因为您不必担心要查询哪个表,因为只有一个items
表。
规范化有助于建立关系,例如,如果要素颜色仅依赖于itemID
,那么它将在同一个表中。如果颜色是一个实体本身,例如itemID
仅描述了一个可用于不同颜色的模型,那么您需要一个人colors
1}}表和一个中间表,它将itemID
与不同的颜色称为复合键。同样,您不必担心以编程方式选择哪个表,因为鞋子和衬衫的颜色将位于同一个表中。您只需LEFT JOIN
该表,以防鞋 正如您在这种情况下可能知道的那样,LEFT JOIN
将始终返回项,如果没有与之关联的颜色将返回null
颜色柱。同样适用于其他属性,如大小,样式,生产者,数量等。请注意,当你有生产者然后它去一个单独的表,因为项目和生产者之间的关系可能是多对一(许多项目可以有必须在item
表中引用相同的生产者)和ID。生产者也可以有许多不同的联系号码,然后联系信息也会转到个人表格。
此方法允许您构建一个单一查询,检索您感兴趣的项目和所有必需的属性。例如,您有鞋类产品说明页面,然后执行以下操作:
SELECT *
FROM items AS i
LEFT JOIN item_colours AS ic ON ic.itemID = i.itemID
LEFT JOIN colours AS c ON ic.colourID = c.colourID
WHERE product_type = 'shoes'
我希望我上面的评论现在更有意义。
答案 1 :(得分:1)
你要做的是JOIN,但是你要把桌子关系弄得一团糟。
主要有两种关系:
ITEMS <-> SHOES
ITEMS <-> SHIRTS
在您的尝试中,您尝试关联两个不相关的表:SHOES
和SHIRTS
。
要从三个表中获取所有数据,您需要两个JOIN,每个关系一个:
SELECT * FROM ITEMS
JOIN SHOES ON SHOES.item_id = ITEMS.id
JOIN SHIRTS ON SHIRTS.item_id = ITEMS.id
要获取单个值,您可以使用where子句(最好是左连接以避免显示null
值):
SELECT * FROM ITEMS
LEFT JOIN SHOES ON SHOES.item_id = ITEMS.id
LEFT JOIN SHIRTS ON SHIRTS.item_id = ITEMS.id
WHERE ITEMS.id = <your_id>
您不知道如何以编程方式选择何时SELECT SHIRTS.*
或SHOES.*
,这表明您需要重新考虑数据模型并重写ITEM表。
也许SHOE_TYPE <-> SHOE_ITEM
和SHIRT_TYPE <-> SHIRT_ITEM
ER模型是更好的方法。
另一种方法是拥有PRODUCT
表,PRODUCT_TYPE
表具有共同的产品类型属性,PRODUCT_TYPE_ATTRIBUTE
表用于特定属性。
答案 2 :(得分:1)
3个表格之间的关系需要&#34;外部联接&#34;如果同时加入所有3个。
SELECT
items.id
, coalesce(shoes.name,shirts.name) as name
FROM ITEMS
LEFT OUTER JOIN SHOES ON SHOES.item_id = ITEMS.id
LEFT OUTER JOIN SHIRTS ON SHIRTS.item_id = ITEMS.id
Take items.id = 22.这只存在于SHIRTS,而不是SHOES。因此,如果连接仅允许&#34;完全匹配&#34;你不能完全匹配&#34;鞋子和衬衫都是22,内部连接&#34;需要完全匹配。
&#34;外部联接&#34;允许存在不匹配的条件,所以在这里我们肯定需要这些。
函数COALESCE()从参数返回第一个NON-NULL值。因此,如果鞋子名称为NULL,则会返回衬衫名称,反之亦然。
答案 3 :(得分:0)
在这种情况下,您需要执行Left Join
,因为您不确定该项目属于哪个表格:
Select H.*, T.*
From Items I
Left Join Shoes H On I.id = H.item_id
Left Join Shirts T On I.Id = T.item_id
Where I.id = 22
理想情况下,这将采用不同的结构,但由于第22项是衬衫,您将看到Null
表的Shoes
值以及Shirts
表中的数据