mysql 匹配所有记录,mysql – 找到一个匹配项后获取所有已连接的记录

这是一个简单的测试数据库,可以解释我的问题:

CREATE TABLE `articles` (

`article_id` int(11) NOT NULL AUTO_INCREMENT,

`article_title` varchar(50) NOT NULL,

PRIMARY KEY (`article_id`)

);

INSERT INTO `articles` VALUES(1, 'first article');

INSERT INTO `articles` VALUES(2, 'second article');

CREATE TABLE `flags` (

`flag_id` int(11) NOT NULL AUTO_INCREMENT,

`flag_name` varchar(50) NOT NULL,

PRIMARY KEY (`flag_id`)

);

INSERT INTO `flags` VALUES(1, 'red');

INSERT INTO `flags` VALUES(2, 'blue');

INSERT INTO `flags` VALUES(3, 'green');

INSERT INTO `flags` VALUES(4, 'orange');

INSERT INTO `flags` VALUES(5, 'purple');

CREATE TABLE `map` (

`map_article_id` int(11) NOT NULL,

`map_flag_id` int(11) NOT NULL,

PRIMARY KEY (`map_article_id`,`map_flag_id`),

KEY `map_flag_id` (`map_flag_id`)

);

INSERT INTO `map` VALUES(1, 1);

INSERT INTO `map` VALUES(1, 2);

INSERT INTO `map` VALUES(2, 2);

INSERT INTO `map` VALUES(2, 3);

INSERT INTO `map` VALUES(1, 4);

生的:

article_id article_title

1 first article

2 second article

flag_id flag_name

1 red

2 blue

3 green

4 orange

5 purple

map_article_id map_flag_id

1 1

1 2

2 2

2 3

1 4

一个带有文章的表,一个带有标志,另一个带有映射文章标志.

选择所有带有连接标志的文章很简单,并且它正常工作:

SELECT `article_id` , `article_title` , GROUP_CONCAT( `flag_name` )

FROM `articles`

LEFT JOIN `map` ON `map_article_id` = `article_id`

LEFT JOIN `flags` ON `flag_id` = `map_flag_id`

GROUP BY `article_id`

结果是:

article_id article_title GROUP_CONCAT(`flag_name`)

1 first article red,blue,orange

2 second article blue,green

问题是,我想找到所有带有一些指定标志的文章,但是GROUP_CONCAT字段完好无损.当我添加WHERE map_flag_id = 1查询返回时:

article_id article_title GROUP_CONCAT(`flag_name`)

1 first article red

如何只获得带有红色但最后一列中包含所有红色,蓝色,橙色标志的文章?请不要建议“LIKE%red%”,我需要这个快.

谢谢

编辑

也许?

SELECT `article_id` , `article_title` , (

SELECT GROUP_CONCAT( `flag_name` )

FROM `flags`

LEFT JOIN `map` ON `map_flag_id` = `flag_id`

WHERE `map_article_id` = `article_id`

)

FROM `articles`

LEFT JOIN `map` ON `map_article_id` = `article_id`

LEFT JOIN `flags` ON `flag_id` = `map_flag_id`

WHERE `flag_id` =1

GROUP BY `article_id`

解决方法:

您可以使用以下解决方案之一:

1.SELECTarticle_id,article_title,GROUP_CONCAT(flag_name)AS标志

FROMarticles

LEFT JOINmapONmap_article_id = article_id

LEFT JOINflagsONflag_id = map_flag_id

GROUP BYarticle_id

有FIND_IN_SET(‘红色’,标志)

>`SELECT a.article_id,a.article_title,GROUP_CONCAT(f.flag_name)AS标志

来自地图m

JOIN篇a ON m.map_article_id = a.article_id AND m.map_flag_id = 1

LEFT JOIN map m1 ON m1.map_article_id = a.article_id

LEFT JOIN标志f ON f.flag_id = m1.map_flag_id

GROUP BY a.article_id`

标签:mysql,join,group-concat

来源: https://codeday.me/bug/20190703/1363678.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值