2009-09-18 39 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