2009-09-18 37 views
2

以下是一些背景信息。我有三个MySQL表(都是InnoDB)。第一个表格用于存储图像记录。第二个表用于存储标签(至标签带有.OMG的图像)。第三个表格用于存储图像和标签之间的关系。 YIPPEE。这是表格的结构。有关外键数据库的MySQL查询问题

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 

在图像数据库中的类型字段是 “图像/ GIF”, “图像/ PNG”,或 “图像/ JPEG”。

而你有它。所以我的桌子上充满了四分之一张图片,10,000个标签和一个图片标签关系度量标准。

1)我需要能够计算出有多少图片有标签。目前我这样做与以下查询:

SELECT COUNT(DISTINCT image_id) 
    FROM images_to_tags 

这是最有效的方式来做到这一点?它似乎有点迂回。这是唯一能够达到这个目的的合理查询吗?

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

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

回答

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 
+0

@mecablaze:在将您的评论发送给Aaron W后,我修改了第二个查询。 – RedFilter 2009-09-18 04:54:07

+0

第一个查询返回每个tag_id出现次数的列表。 第二个查询与其他评论的功能相同(http://stackoverflow.com/questions/1442576/mysql-query-questions-with-a-foreign-key-database/1442619#1442619) – 2009-09-18 04:57:38

+0

啊我的不好。第二个完美的作品。我一定会研究'in'语法。 – 2009-09-18 04:58:58

0

我想你会得到有多少图片有正确标记的计数。如果你想为每种图像类型计数标签,你应该按类型进行计数和分组。试试这个

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

这个计算的标签每个图像说,按类型组织的总数。我一直在寻找按照类型进行标记的图像总数。对困惑感到抱歉! – 2009-09-18 04:46:26

+0

尝试使计数与您的第一个查询相似 SELECT count(DISTINCT'images_to_tags'.'image_id'),'type' FROM' images','images_to_tags' WHERE' images'.'id' ='images_to_tags'.' image_id' GROUP BY'images'.'type' – 2009-09-18 04:56:59