获取n条记录,不包括连接的记录?

hmtdttj4  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(282)

我有三张表(为了简洁起见,省略了细节):

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 使输出按上述方式聚合?

jdzmm42g

jdzmm42g1#

使用子查询选择5个产品,然后使用标记联接:

SELECT p.name as product, t.name AS tag
FROM (
    SELECT id, name
    FROM products
    ORDER by name
    LIMIT 5) AS p
JOIN product_tags AS pt ON pt.product_id = p.id
JOIN tags AS t ON pt.tag_id = t.id

相关问题