我想:
选择所有标签(来自标签表)
使用名为selected
的虚拟列包含布尔值(es.0 || 1)
定义tag_id是否与给定的image_id
相关联(Es.image_id = 1)
它在名为image_tag
的数据透视表中预设的关系数据集结构和数据:
CREATE TABLE IF NOT EXISTS `images` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `images` (`id`, `title`) VALUES
(1, 'Image 1'),
(2, 'Image 2');
CREATE TABLE IF NOT EXISTS `tags` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tags_name_unique` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `tags` (`id`, `name`) VALUES
(1, 'Tag A'),
(2, 'Tag B'),
(3, 'Tag C'),
(4, 'Tag D');
/* Pivot table */
CREATE TABLE IF NOT EXISTS `image_tag` (
`image_id` int(11) NOT NULL,
`tag_id` int(11) NOT NULL,
PRIMARY KEY (`image_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `image_tag` (`image_id`, `tag_id`) VALUES
(1, 1),
(1, 2),
(2, 1),
(2, 3);
SELECT * FROM images;
/*
+----+---------+
| id | title |
+----+---------+
| 1 | Image 1 |
| 2 | Image 2 |
+----+---------+
*/
SELECT * FROM tags;
/*
+----+-------+
| id | name |
+----+-------+
| 1 | Tag A |
| 2 | Tag B |
| 3 | Tag C |
| 4 | Tag D |
+----+-------+
*/
SELECT * FROM image_tag;
/*
+----------+--------+
| image_id | tag_id |
+----------+--------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 3 |
+----------+--------+
*/
我正在寻找的结果:
/*
+----+-------+----------+
| id | tag | selected |
+----+-------+----------+
| 1 | Tag A | 1 |
| 2 | Tag B | 1 |
| 3 | Tag C | 0 |
| 4 | Tag D | 0 |
+----+-------+----------+
*/
感谢您的帮助:)
答案 0 :(得分:1)
在tags
和image_tags
表之间进行左连接,然后使用CASE
表达式检查匹配计数。如果匹配计数为零,则报告selected
列的零,否则报告1。
SELECT
t1.id,
t1.name AS tag,
CASE WHEN COUNT(t2.tag_id) = 0 THEN 0 ELSE 1 END AS selected
FROM tags t1
LEFT JOIN image_tag t2
ON t1.id = t2.tag_id AND
t2.image_id = 1
GROUP BY
t1.id,
t1.name
ORDER BY
t1.id;
注意:我的原始答案返回的标签与任何图像匹配。从那时起,OP让我知道要求是与特定图像匹配的标签。上面的查询和演示反映了这一点,但不是屏幕截图。