mysql - 找到一个匹配项时获取所有加入的记录

标签 mysql join group-concat

这是应该可以解释我的问题的简单测试数据库:

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 标志 来自文章 LEFT JOINmapONmap_article_id=article_id LEFT JOINflagsONflag_id=map_flag_id 分组依据article_id 有 FIND_IN_SET('red', flags)

  1. `SELECT a.article_id , a.article_title , GROUP_CONCAT( f.flag_name ) AS 标志 FROM map 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 flags f ON f.flag_id = m1.map_flag_id

    GROUP BY a.article_id `

关于mysql - 找到一个匹配项时获取所有加入的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106272/

相关文章:

Mysql SQL 修剪 varchar 字段中的前导 0,而不修剪之前的最后一个 0。 (点)

mysql - 在 R 中编写冗长的 SQL 查询

php - 使用 PHP、MYSQL、GROUP_CONCAT 和 JOIN 进行空间搜索

mysql - 如何在MySQL中使用CONCAT()函数?

mysql - 为什么 Django 在 Change List View Page 中进行不必要的 SQL 查询?

mysql - brew 启动旧版本的 mysql 服务,但如何连接到它?

arrays - Postgres - 加入数组值

join - pyspark通过特定键加入rdds

sql - 连接查询是否正确?

php - 为什么 GROUP_CONCAT + DISTINCT 在某些服务器上会触发内存不足(需要 8388580 字节)?