MySQL查询问题与外键数据库

时间:2009-09-18 04:19:58

标签: sql mysql innodb

这是一些背景信息。我有三个MySQL表(所有InnoDB)。第一个表用于存储图像记录。第二个表用于存储标签(使用.OMG标记标记图像)。第三个表用于存储图像和标签之间的关系。 YIPPEE。这是表格的结构。

CREATE TABLE `images` (
  `id` int(8) unsigned NOT NULL AUTO_INCREMENT,
  `image` varchar(32) NOT NULL,
  `type` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

CREATE TABLE `tags` (
  `id` int(8) unsigned NOT NULL AUTO_INCREMENT,
  `tag` varchar(64) NOT NULL,
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB

CREATE TABLE `images_to_tags` (
  `image_id` int(8) unsigned NOT NULL,
  `tag_id` int(8) unsigned NOT NULL,
  PRIMARY KEY (`image_id`,`tag_id`),
  KEY `tag_id` (`tag_id`),
  CONSTRAINT `images_to_tags_ibfk_2` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `images_to_tags_ibfk_1` FOREIGN KEY (`image_id`) REFERENCES `images` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

图像数据库中的类型字段是“image / gif”,“image / png”或“image / jpeg”。

你有它。因此,我的表格中包含了25万个图像,10,000个标记以及图像标记关系的度量标准。

1)我需要能够计算有多少图像有标签。目前我正在使用以下查询:

SELECT COUNT(DISTINCT image_id) 
  FROM images_to_tags

这是最有效的方法吗?这似乎有点迂回曲折。这是唯一能达到此目的的合理查询吗?

2)对于图像的每个类型,我想找出标记了多少图像。所以说大约有5000张图片都有标签,我怎么知道这些5,000张标记图片中有多少是 type “image / png”。这对我不起作用:

SELECT COUNT(id), type 
  FROM images, 
       images_to_tags 
 WHERE images.id = images_to_tags.image_id 

2 个答案:

答案 0 :(得分:3)

您的第一个查询的变体是:

select count(*) 
from images_to_tags
group by image_id

对于你的第二个:

select type, count(*) 
from images 
where id in (select image_id from images_to_tags)
group by type

答案 1 :(得分:0)

我认为你正在计算有多少图像正确标记。如果要为每种图像类型计算标签数量,则应按类型进行计数和分组。试试这个

SELECT count(`id`), `type` FROM `images`, `images_to_tags` WHERE `images`.`id` = `images_to_tags`.`image_id` GROUP BY `images`.`type`