Вопросы MySQL Query с базой данных внешнего ключа - PullRequest
2 голосов
/ 18 сентября 2009

Вот некоторая справочная информация. У меня есть три таблицы 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

Поле type в базе данных изображений имеет вид «image / gif», «image / png» или «image / jpeg».

И вот оно у тебя. Таким образом, мои таблицы счастливо заполнены четвертью миллионами изображений, 10000 тегами и метрической кучей связей между изображениями и тегами.

1) Мне нужно посчитать, сколько изображений имеют теги. В настоящее время я делаю это с помощью следующего запроса:

SELECT COUNT(DISTINCT image_id) 
  FROM images_to_tags

Это самый эффективный способ сделать это? Это кажется чем-то окольным. Это единственный разумный запрос, который достигнет этой цели?

2) Для каждого типа изображения я хочу узнать сколько изображений помечено . Скажем, около 5000 изображений имеют теги, откуда мне знать, сколько из этих 5000 изображений имеют теги типа"image / png". Это не работает для меня:

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

Ответы [ 2 ]

3 голосов
/ 18 сентября 2009

Вариант вашего первого запроса:

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 голосов
/ 18 сентября 2009

Я думаю, вы подсчитали, сколько изображений имеют метки правильно. Если вам нужно количество тегов для каждого типа изображения, вы должны выполнить подсчет и группировать по типу. Попробуйте это

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