我有一个包含2个表的数据库,如下所示:
content
id name
1 Cool Stuff
2 Even Better stuff
-
contentFields
id content label value
5 1 Rating Spectacular
6 1 Info Top Notch
7 2 Rating Poor
正如您所见,content
表的contentFields
列与id
表的content
列重合。
我想编写一个查询来抓取所有内容并将适用的内容字段与正确的内容一起存储,以便它出现:
[
{
id: 1,
name: 'Cool Stuff',
contentFields: [
{label: 'Rating', value: 'Spectacular'},
{label: 'Info', value: 'Top Notch'}
]
},
{
id: 2,
name: 'Even Better Stuff',
contentFields: [
{label: 'Rating', value: 'Poor'}
]
}
]
我尝试了这样的内部联接:
SELECT * FROM content INNER JOIN contentFields ON content.id = contentFields.content GROUP BY content.id
但那并没有这样做。
*注意:我知道我可以通过2个单独的查询执行此操作,但我想知道如何在一个查询中执行此操作,因为这将显着提高性能。
答案 0 :(得分:0)
只有SQL才能直接实现您想要实现的目标。
正如您已经说明的那样,您正在寻找表格中的表格。但MySQL并不知道这些概念,据我所知,其他数据库也没有。结果集总是像一张桌子;结果集的每一行都具有相同的结构。
所以你要么让GROUP BY content.id
到位;然后,对于结果集中的每一行,MySQL将从连接表中选择一个随机行,该行符合该行的content.id
(您甚至不能依赖它在每次都是同一行)。
或者您删除了GROUP BY
;那么你将从连接表中得到每一行,但这不是你想要的那样。
当性能出现问题时,我可能会选择第二个选项,添加ORDER BY content.id
,然后自己生成JSON。您可以通过循环遍历结果集并在每次content.id
更改时开始新的JSON块来完成此操作。
免责声明以下是纯粹的推测。
我对node.js及其如何将结果集转换为JSON知之甚少。但我强烈认为你可以配置它的行为;否则,它在大多数情况下实际上没有任何用处。因此必须有一种方法来告诉它应该如何对结果集中的行进行分组。
如果我是对的,你首先要告诉node.js如何对结果集进行分组,然后让它处理上面第二个选项中的行(即没有GROUP BY
)。