Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > [MySQL] Посчет категорий


Автор: MoLeX 29.4.2013, 13:52
Добрый день.
Помогите составить запрос подсчитывающий количество одинаковых категорий у авторов.

Вот используемые таблицы
Код

CREATE TABLE IF NOT EXISTS `book_genre` (
  `book_id` bigint(20) NOT NULL DEFAULT '0',
  `genre_id` bigint(20) NOT NULL DEFAULT '0',
  KEY `book_id` (`book_id`),
  KEY `genre_id` (`genre_id`)
) ENGINE=MyISAM;

CREATE TABLE IF NOT EXISTS `book_author` (
  `book_id` bigint(20) NOT NULL DEFAULT '0',
  `author_id` bigint(20) NOT NULL DEFAULT '0',
  KEY `book_id` (`book_id`),
  KEY `author_id` (`author_id`)
) ENGINE=MyISAM;


Получается что:
1. книга может принадлежать нескольким категориям
2. книга может принадлежать нескольким авторам

А на входе имеем список категорий.

book_id - книга
genre_id - категории
author_id - автор

Автор: Akina 29.4.2013, 14:44
Цитата(MoLeX @  29.4.2013,  14:52 Найти цитируемый пост)
запрос подсчитывающий количество одинаковых категорий у авторов

Вопрос непонятен.
Дано два автора, и надо посчитать, сколько различающихся категорий имеется в списке категорий у каждого из авторов? Или имеется в виду что-то иное?

Дайте дополнительно тестовое наполнение таблиц, входные данные и результат на этих входных данных и этом наполнении. С пояснением, почему именно так.

Автор: MoLeX 30.4.2013, 05:48
Akina, прошу прощения за неполную информацию.
Исправляюсь:
Код

CREATE TABLE IF NOT EXISTS `book_genre` (
  `book_id` bigint(20) NOT NULL DEFAULT '0',
  `genre_id` bigint(20) NOT NULL DEFAULT '0',
  KEY `book_id` (`book_id`),
  KEY `genre_id` (`genre_id`)
) ENGINE=MyISAM;
INSERT INTO `book_genre` (`book_id`, `genre_id`) VALUES 
(101, 201), (101, 202), (101, 203), (102, 202), (102, 200), (103, 200);

CREATE TABLE IF NOT EXISTS `book_author` (
  `book_id` bigint(20) NOT NULL DEFAULT '0',
  `author_id` bigint(20) NOT NULL DEFAULT '0',
  KEY `book_id` (`book_id`),
  KEY `author_id` (`author_id`)
) ENGINE=MyISAM;
INSERT INTO `book_author` (`book_id`, `author_id`) VALUES 
(101, 301), (102, 302), (102, 303), (103, 304);


На входе имеем genre_id - 200,201,202,203
На выходе должно получиться такое:
author_id | COUNT(genre_id)
-------------------------------------
       301   |            3
       302   |            2
       303   |            2
       304   |            1

Автор: Akina 30.4.2013, 07:54
Код

select
  a.author_id
, count(a.author_id) cnt 
from
  book_genre g
, book_author a 
where
  g.book_id=a.book_id
and
  g.genre_id in (200,201,202,203) 
group by
  a.author_id;

Автор: MoLeX 30.4.2013, 11:59
Akina, спасибо большое. работает как надо  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)