Мой SQL

Практичное введение в MySQL

Домашнее задание

Автор - Геогрий Бажуков / @_bugov

Условие

Делаем доску для котосообщества.

  • кот может относиться только к 1 городу и к 1 хозяину, являющегося пользователем сайта котиков, но обратное не верно (т.е. не у каждого посетителя сайта должен быть кот),
  • у одного кота может быть множественная окраска (несколько записей в cats_colours для одного cat_id),
  • один пользователь может лайкнуть фотку понравившегося котика только 1 раз.

Also

  • нужно уметь делать выборку по городу, цвету
  • нужно уметь делать range по дате рождения
  • кот может лайкать человека (1 раз)
          
  CREATE TABLE IF NOT EXISTS `cats` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `name` varchar(50) collate utf8_unicode_ci NOT NULL,
    `birthday` date default NULL,
    `price` double(16,2) NOT NULL default '0.00',
    `town_id` int(11) unsigned NOT NULL,
    `owner_id` int(11) unsigned NOT NULL,
    PRIMARY KEY  (`id`),
    KEY `town_id` (`town_id`),
    KEY `owner_id` (`owner_id`)
  ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
          
          
  CREATE TABLE IF NOT EXISTS `colours` (
    `id` int(5) unsigned NOT NULL auto_increment,
    `name` varchar(100) collate utf8_unicode_ci NOT NULL,
    `picture` varchar(255) collate utf8_unicode_ci default NULL,
    PRIMARY KEY  (`id`)
  ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
          
  CREATE TABLE IF NOT EXISTS `cats_colours` (
    `cat_id` int(11) unsigned NOT NULL,
    `colour_id` int(5) unsigned NOT NULL,
    KEY `cat_id` (`cat_id`),
    KEY `colour_id` (`colour_id`),
    KEY `cat_id_2` (`cat_id`,`colour_id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
          
          
  CREATE TABLE IF NOT EXISTS `cats_likes` (
    `owner_id` int(11) unsigned NOT NULL,
    `cat_id` int(11) unsigned NOT NULL,
    UNIQUE KEY `owner_id` (`owner_id`,`cat_id`),
    KEY `cat_id` (`cat_id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
          
          
  CREATE TABLE IF NOT EXISTS `towns` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `name` varchar(50) collate utf8_unicode_ci NOT NULL,
    PRIMARY KEY  (`id`)
  ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  
  CREATE TABLE IF NOT EXISTS `owners` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `nik` varchar(50) collate utf8_unicode_ci NOT NULL,
    `email` varchar(50) collate utf8_unicode_ci default NULL,
    `name` varchar(100) collate utf8_unicode_ci default NULL,
    PRIMARY KEY  (`id`)
  ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
          

Диаграмка

Запрос

          
  select * from cats c
  left join towns t on (c.town_id = t.id)
  left join owners o on (o.id = c.owner_id)
  join cats_colours cc on (c.id = cc.cat_id)
  left join colours cl on (cl.id = cc.colour_id)
  where t.name IN ('Екатеринбург', 'Среднеуральск',
      'Челябинск', 'Магнитогорск', 'Берёзовский', 'Курган')
    and cl.name in ('белый', 'чёрный', 'мраморный', 'рыжий', 'голубой')
  order by c.birthday, c.price
          

Explain

ALL?

Всё плохо?

!THE END

georgy.bazhukov@gmail.com

@_bugov