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

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 上加入

【讨论】:

以上是关于如何加入/子查询第二个表的主要内容,如果未能解决你的问题,请参考以下文章

Knex 子查询对第二个表中的数据求和

Laravel中的MySQL子查询,如何加入查询并将第二个查询的结果作为新列添加到第一个查询?

查看 vs 表值函数 vs 子查询

如何使用子查询的多行返回值插入表中?

bigquery:依靠子查询的联合

选择数组、子查询和多行结果