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

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

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

Студворк — интернет-сервис помощи студентам
Добрый день. Существует таблица участников (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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.03.2014, 12:52
Ответы с готовыми решениями:

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

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

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

4
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
14.03.2014, 13:45
Лучший ответ Сообщение было отмечено 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
странник
 Аватар для Donald28
810 / 481 / 108
Регистрация: 28.05.2012
Сообщений: 1,518
Записей в блоге: 2
14.03.2014, 14:26  [ТС]
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
Лучший ответ Сообщение было отмечено Donald28 как решение

Решение

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

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.03.2014, 16:02
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru