如何加入/子查询第二个表

时间:2012-08-08 16:52:00

标签: mysql sql join subquery

我有两个表,一个表在每一行中都有一些信息以及另一个表包含的逗号分隔的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中没有连接这样的东西?奖金帮助将帮助我设置这些表格,以便我可以转换过来,减少转换和难度。

2 个答案:

答案 0 :(得分:3)

您需要添加另一张表。

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

作为交换额外空间(通过多次复制Thing信息)和潜在的数据管理难题(保持重复数据同步)的交换,您可以获得更简单,更快速的查询。

所以你的最后一张桌子看起来像这样:

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的值。

答案 1 :(得分:2)

您应该考虑规范化数据库架构以使用连接。使用逗号分隔列表将不允许您使用任何SQL IN命令。

最好的方法是为每个唯一ID存储一行,然后就可以加入TableA.id = TableB.id