我有两张table:
post
有一个id和一些数据字段tags
,它有一个post id(posts.id
上的外键),一个key和一个value字段(没有id或索引,只有元组)
文章:
| id | title | body |
+----+-------+------+
| 1 | t1 | b1 |
| 2 | t2 | b2 |
标签
| post | key | value |
+------+-----+-------+
| 1 | bar | baz |
| 1 | foo | bar |
如果我想检索一些有自己标签的帖子,可以使用这样的查询:
select posts.*, tags.*
from posts
left join tags on posts.id = tags.post
我会得到
| id | title | body | post | key | value |
+----+-------+------+------+-----+-------+
| 1 | t1 | b1 | 1 | bar | baz |
| 1 | t1 | b1 | 1 | foo | bar |
| 2 | t2 | b2 | | | |
但是我想为post获取一行,所以我在这个查询中按照Id和group_concat
标记的数据以json方式对查询进行分组
(注意,我是在SQLite数据库上做这个实验的,||
是字符串连接的操作符)
select
posts.*,
"{" || group_concat('"' || tags.key || '": "' || tags.value || '"') || "}" as tags
from
posts
left join
tags on posts.id = tags.post
group by
posts.id
而这就是结果
| id | title | body | tags |
+----+-------+------+-----------------------------+
| 1 | t1 | b1 | {"bar": "baz","foo": "bar"} |
| 2 | t2 | b2 | |
我的问题是:有没有更好的方法来聚合标签结果?我指的是更类似于普通SQL表的东西,也许是不需要解析的东西(甚至是可查询的东西)。
我想在 tags 单元格中得到一个表,类似这样
| id | title | body | tags |
| | | | key | value |
+----+-------+------+-----+-------+
| 1 | t1 | b1 | bar | baz |
| | | +-----+-------+
| | | | foo | bar |
+----+-------+------+-----+-------+
| 2 | t2 | b2 | | |
+----+-------+------+-----+-------+
这在某种程度上是可以实现的吗(即使使用不同的sql dbms)?
1条答案
按热度按时间1yjd4xko1#
SQL查询的结果是一个由行和列组成的数据集,没有表中表或单元格中单元格的概念。
最符合您要求的查询是在每个组的第一行之后返回
null
s或空白:结果如下:
| ID|标题|身体|邮政|关键|值|
| --|--|--|--|--|--|
| 1 |T1| B1| 1 |酒吧|Baz|
| null| null| null| 1 |Foo|酒吧|
| 2 |T2| B2| null| null| null|
或者:
结果如下:
| ID|标题|身体|邮政|关键|值|
| --|--|--|--|--|--|
| 1 |T1| B1| 1 |酒吧|Baz|
| | | 酒吧|| bar ||
| 2 |T2| B2||||
参见demo。