如何查询N条产品记录并排除已关联标签的记录?
嘿,我来帮你梳理下你的表结构和数据,再给出符合常见需求的查询方案~
表结构定义
首先是你的三张表的创建语句:
CREATE TABLE products ( id INT, name VARCHAR(50) ); CREATE TABLE tags ( id INT, name VARCHAR(50) ); CREATE TABLE product_tags ( product_id INT, tag_id INT );
现有数据
products表数据
| id | name |
|---|---|
| 1 | Rice |
| 2 | Bean |
| 3 | Milk |
tags表数据
| id | name |
|---|---|
| 1 | Eat |
| 2 | Drink |
| 3 | Seeds |
| 4 | Cow |
(注:你没给出product_tags表的关联数据,我先假设一组常见的关联场景来举例:
- Rice关联Eat和Seeds
- Bean关联Eat和Seeds
- Milk关联Drink和Cow)
常见需求的查询示例
需求1:获取每个产品+合并后的标签列表
如果想把每个产品对应的所有标签合并成逗号分隔的字符串,用这个SQL:
SELECT p.id, p.name, GROUP_CONCAT(t.name SEPARATOR ', ') AS tags FROM products p LEFT JOIN product_tags pt ON p.id = pt.product_id LEFT JOIN tags t ON pt.tag_id = t.id GROUP BY p.id, p.name;
假设product_tags数据如下:
| product_id | tag_id |
|---|---|
| 1 | 1 |
| 1 | 3 |
| 2 | 1 |
| 2 | 3 |
| 3 | 2 |
| 3 | 4 |
查询结果会是:
| id | name | tags |
|---|---|---|
| 1 | Rice | Eat, Seeds |
| 2 | Bean | Eat, Seeds |
| 3 | Milk | Drink, Cow |
需求2:获取产品-标签的逐行对应关系
如果需要每行显示一个产品和一个对应的标签(无标签的产品也会显示),用这个查询:
SELECT p.id AS product_id, p.name AS product_name, t.id AS tag_id, t.name AS tag_name FROM products p LEFT JOIN product_tags pt ON p.id = pt.product_id LEFT JOIN tags t ON pt.tag_id = t.id;
内容的提问来源于stack exchange,提问作者rodrigo-silveira
相关产品推荐
相关产品推荐

