我有三张表(为了简洁起见,省略了细节):
create table products (
id,
name
)
create table tags (
id,
name
)
create table product_tags (
product_id,
tag_id
)
这些表的填充方式如下:
--------
products
--------
+----+------+
| id | name |
+----+------+
| 1 | Rice |
| 2 | Bean |
| 3 | Milk |
+----+------+
----
tags
----
+----+-------+
| id | name |
+----+-------+
| 1 | Eat |
| 2 | Drink |
| 3 | Seeds |
| 4 | Cow |
+----+-------+
提取时 products
我希望输出格式为:
[{
id: 1,
name: 'Rice',
tags: [
{
id: 1,
name: 'Eat'
},
{
id: 3,
name: 'Seeds'
},
]
},
{
id: 2,
name: 'Bean',
tags: [
{
id: 1,
name: 'Eat'
},
{
id: 3,
name: 'Seeds'
},
]
},
{
id: 3,
name: 'Milk',
tags: [
{
id: 2,
name: 'Drink'
},
{
id: 4,
name: 'Cow'
},
]
}]
为此,我要做的是:
select
products.*,
tags.id as tag_id, tags.name as tag_name
from products
left join product_tags map on map.product_id = products.id
left join tags on map.tag_id = tags.id
其输出为:
[{
id: 1,
name: 'Rice',
tag_id: 1,
tag_name: 'Eat',
},{
id: 1,
name: 'Rice',
tag_id: 3,
tag_name: 'Seeds',
},{
id: 2,
name: 'Bean',
tag_id: 1,
tag_name: 'Eat',
},{
id: 2,
name: 'Bean',
tag_id: 3,
tag_name: 'Seeds',
},{
id: 3,
name: 'Milk',
tag_id: 2,
tag_name: 'Drink',
},{
id: 3,
name: 'Milk',
tag_id: 4,
tag_name: 'Cow',
}]
我手工分析并汇总每一个 product
具有零个或多个数组的示例 tag
与之关联的对象。
问题
在进行 select
在上面,输出是6行。但是,只有3个 products
. 有没有可能使用 limit
只适用于 products
?
例如,如果 Product.id => 1
有10个 tags
与之相关,做一个 LIMIT 5
只会选择5个标签。我要做的是选择5 products
以及与之相关的所有标记。
我能想到的唯一方法就是选择 products
,然后执行无界 SELECT
仅使用上一个查询中的产品ID。
奖金问题
有没有更有效的方法 JOIN
使输出按上述方式聚合?
1条答案
按热度按时间jdzmm42g1#
使用子查询选择5个产品,然后使用标记联接: