Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
странник
810 / 481 / 108
Регистрация: 28.05.2012
Сообщений: 1,518
Записей в блоге: 2
1

Реализация сложного запроса

14.03.2014, 12:52. Показов 1271. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Существует таблица участников (users):
Таблица1
id event_a event_b promo action
1 1 0 1
2 1 1 1
3 1 1 asdr 1
4 0 1 eeee 1
5 1 0 asdr 0
6 1 1 0
7 0 1 1
8 1 0 0
id - уникальный номер участника
event_a - флажок участия в мероприятии А (1 - участвует, 0 - нет)
event_b - флажок участия в мероприятии B (1 - участвует, 0 - нет)
promo - наличие у участника ключевого слова (промо-кода) {он может быть одинаковым максимум у 2-х участников}
action - участник участвует в мероприятии(-ях) по акции

требуется вывести таблицу-отчет по количеству участников:
таблица2
стандартное по акции по промо коду по акции+промо
Мероприятие А 2* 2* 1 1
Мероприятие В 1 2 0 2

стандартное - это когда участник НЕ имеет промо-кода И акции.

Таблица 2 выводится через php.
Решение, которое я нашел для решения этой задачи, является решением "в лоб". То есть написание отдельного запроса для каждой ячейки таблицы 2.
пример для ячеек со звездочкой:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    (SELECT
        COUNT(DISTINCT id)
    FROM
        users
    WHERE
        event_a=1 AND
        promo='' AND
        action=0) AS standart_a,
 
    (SELECT
        COUNT(DISTINCT id)
    FROM
        users
    WHERE
        event_a=1 AND
        promo='' AND
        action=1) AS action_a
Вопрос: можно ли реализовать запрос проще?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2014, 12:52
Ответы с готовыми решениями:

Создание сложного запроса
Добрый вечер, друзья! Настала необходимость написать запрос, но он оказался сильнее меня:jokingly:....

Формирование сложного запроса MySQL
Надо взять avg число продаж, и просто вытаскиваем фамилии тех продавцов, чьи количество продаж выше...

Составление сложного запроса на объединение таблиц
Всем привет! Есть таблицы из которых мы берем: banners.*, map_point.id, map_point.expiration_date,...

Составление сложного запроса, выборка по двум таблицам
в общем есть 2 таблицы, `template` и `template_design`, поля такие `template` = id,name....

4
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
14.03.2014, 13:45 2
Лучший ответ Сообщение было отмечено Donald28 как решение

Решение

MySQL
1
2
3
4
5
6
7
8
select a.actions, 
   sum(if(a.id,u.event_a,u.event_b))total,
   sum(if(a.id,u.event_a,u.event_b)*if(nullif(u.promo,'') is null,1,0)*u.action)action,
   sum(if(a.id,u.event_a,u.event_b)*if(nullif(u.promo,'') is null,0,1)*(1-u.action))promo,
   sum(if(a.id,u.event_a,u.event_b)*if(nullif(u.promo,'') is null,0,1)*u.action)promo_action
from users u
cross join (select 1 id,'Мероприятие А' actions union all select 0,'Мероприятие В')a
group by a.actions;
1
странник
810 / 481 / 108
Регистрация: 28.05.2012
Сообщений: 1,518
Записей в блоге: 2
14.03.2014, 14:26  [ТС] 3
cygapb-007, спасибо.
Правильно ли я понял, что если бы мероприятий было равно 3-м, то следует сделать след. запрос:
SQL
1
2
3
4
5
6
7
8
SELECT a.actions, 
   SUM(CASE a.id WHEN 1 THEN u.event_a WHEN 0 THEN u.event_b WHEN 2 THEN u.event_c END)total,
   SUM((CASE a.id WHEN 1 THEN u.event_a WHEN 0 THEN u.event_b WHEN 2 THEN u.event_c END)*IF(NULLIF(u.promo,'') IS NULL,1,0)*u.action)action,
   SUM((CASE a.id WHEN 1 THEN u.event_a WHEN 0 THEN u.event_b WHEN 2 THEN u.event_c END)*IF(NULLIF(u.promo,'') IS NULL,0,1)*(1-u.action))promo,
   SUM((CASE a.id WHEN 1 THEN u.event_a WHEN 0 THEN u.event_b WHEN 2 THEN u.event_c END)*IF(NULLIF(u.promo,'') IS NULL,0,1)*u.action)promo_action
FROM users u
CROSS JOIN (SELECT 1 id,'Мероприятие А' actions UNION ALL SELECT 0,'Мероприятие В' UNION ALL SELECT 2,'Мероприятие С') a
GROUP BY a.actions;
??
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
14.03.2014, 15:54 4
Лучший ответ Сообщение было отмечено Donald28 как решение

Решение

http://sqlfiddle.com/#!2/2050c/1
1
странник
810 / 481 / 108
Регистрация: 28.05.2012
Сообщений: 1,518
Записей в блоге: 2
14.03.2014, 16:02  [ТС] 5
спасибо за эволюцию предыдущего кода.

Не по теме:

P.S. сколько же можно сделать с использованием только SQL. Круто.

0
14.03.2014, 16:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2014, 16:02
Помогаю со студенческими работами здесь

Написании сложного запроса для копирования данных из табл1 в табл2 с изменением
Добрый день. Есть БД на MSSQL 2005. Существует две таблицы: Contacts: ID ...

Созтавление сложного запроса
Здравствуйте! Уже вторые сутки не могу справиться с задачей, поэтому решил обратиться к знающим. И...

Составление сложного запроса
Всем доброго времени суток, помогите составить запрос, в котором будет выводится количество...

Построение сложного запроса
Есть 4 таблицы в Акцесе (Заказы, Отгрузка, Склад, Позиции), связанны через таблицу Заказы по полю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru