如何加入/子查询第二个表
Posted
技术标签:
【中文标题】如何加入/子查询第二个表【英文标题】:How to join/subquery a second table 【发布时间】:2012-08-08 16:51:59 【问题描述】:我有两个表,一个表在每一行中都有一些信息,以及另一个表包含的逗号分隔的 id 列表。现在我正在从表 A 中获取数据(使用逗号分隔的 id),并且我还想从表 B(包含附加信息的表)中获取所有数据。我想用最有效的 SQL 方法来做到这一点。
我正在考虑根据字段中的 id 将表 B 连接到表 A,但我不确定这是否可能。同样重要的是要注意,我是根据另一个 IN 语句从表 A 中获取数据,所以我的最终目标是将表 B 中的所有行附加到表 A 的行,具体取决于表 A 行中的字段中的哪些 id (逐行)
如果有人可以遵循所有这些并且知道我想要做什么,我会很感激一个示例查询:D
如果您需要任何进一步的说明,我很乐意提供。
谢谢
现在表 A 的设置方式:
`table_a_id` VARCHAR ( 6 ) NOT NULL,
`table_b_ids` TEXT NOT NULL, -- This is a comma seperated list at the moment
-- More data here that is irrelevant to this question but i am grabbing
表 B 的设置如下:
`table_b_id` VARCHAR ( 6 ) NOT NULL,
`name` VARCHAR ( 128 ) NOT NULL,
-- More data that is not relevant to the question
另外我想最终切换到像 Cassandra 这样的 NOSQL 系统,根据我简要阅读的内容,我知道 NOSQL 中没有连接之类的东西?额外的帮助是帮助我设置这些表格,这样我就可以以更少的转换和难度进行转换。
【问题讨论】:
存储在表中的 ID 的逗号分隔列表?这是你的第一个错误。规范化您的数据,这些类型的查询问题变得更容易解决。 en.wikipedia.org/wiki/Database_normalization 表定义和您的初始查询会很好。 dev.mysql.com/doc/refman/5.1/en/join.html - 你需要了解 JOIN。 您是否介意发布一个表格和一个到目前为止的查询。一般来说,连接是首选方式。 在数据库中存储逗号分隔列表是否有特殊原因?使用这样存储的数据,您的生活比应有的要困难得多... 【参考方案1】:您需要添加另一个表。
Person -- your Table A
------
PersonID
Thing -- your Table B
------
ThingID
ThingName
PersonThing -- new intersection table
-------
PersonID
ThingID
那么你的查询就变成了
SELECT * from Person
INNER JOIN PersonThing ON Person.PersonID = PersonThing.PersonID
INNER JOIN Thing ON PersonThing.ThingID = Thing.ThingID
那么你现在在哪里
001 | Sam Spade | 12,23,14
你会的
Person
001 | Sam Spade
Thing
12 | box
23 | chair
14 | wheel
PersonThing
001 | 12
001 | 23
001 | 14
这就是其他答案所说的“规范化”。
编辑添加
根据我对 NoSQL 的了解,您可以像这样绕过连接:
Person -- your Table A
------
PersonID
OtherPersonStuff
Thing -- your Table B
------
ThingID
ThingName
OtherThingStuff
PersonThing -- denormalized table, one record for each Thing held by each Person
-------
PersonID
ThingID
ThingName
OtherThingStuff
为了换取占用额外空间(通过多次复制事物信息)和潜在的数据管理难题(保持副本同步),您可以获得更简单、更快的查询。
所以你的最后一张桌子应该是这样的:
PersonThing
001 | 12 | box | $2.00
001 | 23 | chair | $3.00
001 | 14 | wheel | $1.00
002 | 12 | box | $2.00
003 | 14 | wheel | $1.00
在这种情况下,OtherThingStuff 是 Thing 的值。
【讨论】:
能不能快点看一下lest edit?将不胜感激:) 谢谢 谢谢 :) 非常感谢,这就是我认为我需要做的,但想先与其他人核实 :)【参考方案2】:您应该考虑规范化您的数据库架构以使用连接。使用逗号分隔的列表将不允许您使用任何 SQL IN 命令。
最好的方法是为每个唯一 ID 存储一行,然后您可以在 TableA.id = TableB.id
上加入
【讨论】:
以上是关于如何加入/子查询第二个表的主要内容,如果未能解决你的问题,请参考以下文章