Тестовые задания для собеседования на соображалку

Задача 1

Есть новость и категория новости. Новость может принадлежать нескольким категориям. 3нф. Нужно выбрать новости, которые не принадлежат категории с cat_id=5 И которые не принадлежит двум категориям одновременно. Сделайте это одним запросом с использованием join-ов.

Хорошо, чтобы программист сам составил схему таблиц. А проверить его ответ можно по схеме:

CREATE TABLE `cat` (
   `id` int(11) NOT NULL,
   PRIMARY KEY (`id`)
);

INSERT INTO `cat` VALUES (1),(2),(3),(4),(5);

CREATE TABLE `news` (
   `id` int(11) NOT NULL,
   `name` varchar(45) DEFAULT NULL,
   PRIMARY KEY (`id`)
);

INSERT INTO `news` VALUES (6,'6y'),(7,'7u'),(8,'8i'),(9,'9o'),(10,'10p');

CREATE TABLE `news_cat` (
   `news_id` int(11) NOT NULL,
   `cat_id` int(11) NOT NULL
);

INSERT INTO `news_cat` VALUES (6,1),(6,2),(7,3),(8,4),(10,5);

И правильный запрос:

select n.*, count(*) AS h
from news_cat AS nc
left join cat AS c ON c.id = nc.cat_id
left join news AS n ON n.id = nc.news_id
where nc.cat_id <> 5
group by nc.news_id
having h <> 2

Задача 2

Есть таблица пользователей, в которой есть поле группы, к которой принадлежит пользователь и пол пользователя.

CREATE TABLE `users` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `group_id` int(11) NOT NULL DEFAULT '0',
   `gender` enum('m','w') DEFAULT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB

INSERT INTO `users` VALUES (1,1,'m'),(2,1,'m'),(3,1,'m'),(4,1,'w'),(5,2,'m'),(6,2,'w'),(7,3,'w'),(8,3,'w');

Необходимо найти group_id, в которых мужчин больше чем женщин. И правильный ответ:

SELECT *, count(*) AS x,
count(IF (gender='m', 1, NULL)) as m,
count(IF (gender='w', 1, NULL)) as w
FROM users
GROUP BY group_id
HAVING m > w

Удачки.

Оцени публикацию:
  • 3,14
Оценили человек: 3

Похожие статьи:

Справочники и учебники:


Комментарии посетителей:
  • Вы уверены, что правильный запрос на 1 вопрос будет именно таким?
    У меня, с другими данными он не прошёл. Более того, а что если будут новости без категорий вообще?
    Вот мой запрос:
    SELECT news.id, COUNT(DISTINCT nc1.cat_id) nc1_count, COUNT(DISTINCT nc2.cat_id) nc2_count
    FROM news
    LEFT JOIN news_cat nc1 ON news.id = nc1.news_id
    LEFT JOIN news_cat nc2 ON news.id = nc2.news_id AND nc2.cat_id <> 5
    GROUP BY news.id
    HAVING nc1_count = nc2_count
    24 сентября 2014, 19:59 коммент полезен : 0 # Илья (гость)
    • Наверное не хватает условия: новостей без категорий не бывает
      17 июля 2015, 17:51 коммент полезен : 0 # Lebnik
  • По первому вопросу - оба варианта (в теле и в комментарии) не верные. Думайте.
    18 мая 2015, 15:35 коммент полезен : 0 # Дмитрий (гость)
    • уже подумал, может подскажите правильный ответ?:)
      17 июля 2015, 17:52 коммент полезен : 0 # Lebnik (гость)
Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

Новые заметки:

Про что мы забываем когда делаем оценку задачи по времени

Список вопросов для собеседования разработчика по телефону

Symfony2 авторизация без Doctrine2 для чайника

Phpstorm7 LiveEdit

Жесткий хабр или не хабр, тогда кто?

Яндекс.Деньги мошенничество

Как узнать какие страницы в поиске яндекса или это секрет

Последние комменты:

Yapro CMS:

Здравствуйте, Гость | Войти | Регистрация | Карта сайта | RSS ленты | Ошибка в тексте? Выделите её мышкой и нажмите: Ctrl + Enter

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2018 YaPro.Ru

Главная » Веб-мастеру » MySQL »