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

Задача 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

Удачки.

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

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

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


Комментарии посетителей:
  • Вы уверены, что правильный запрос на 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

youtube.com/watch?v=7hFivbgIEqk

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

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