powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Объеденить 5 запросов в один
15 сообщений из 15, страница 1 из 1
Объеденить 5 запросов в один
    #38683905
Mc Doc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите объеденить 5 запросов в один.
Проблема, все запросы обращаются только к одной таблице. То есть мы собираем данные из таблицы которые соответствуют определеным условиям.

Коды:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
-- Query Once

SELECT  `description` AS  'Task', DATE_FORMAT( current_date,  '%d %b %y' ) AS  'Current date',  `start_time` AS  'Time'
FROM tasks
WHERE  `code` LIKE  'once'
AND  `start_date` = current_date
AND  `start_time` > current_time
AND  `exp_day` >= current_date
ORDER BY  `start_time` 

-- Query Daily

SELECT  `description` AS  'Task', DATE_FORMAT(current_date,  '%d %b %y') AS  'Current date',  `start_time` AS  'Time'
FROM tasks
WHERE  `code` LIKE  'daily'
AND  `start_time` > current_time
AND  `exp_day` >= current_date
ORDER BY  `start_time` 

-- Query Weekly

SELECT  `description` AS  'Task', DATE_FORMAT( current_date,  '%d %b %y' ) AS  'Current date',  `start_time` AS  'Time'
FROM tasks
WHERE  `code` LIKE  'weekly'
AND  `start_time` > current_time
AND  `exp_day` >= current_date
AND  `day_of_week` = DAYOFWEEK( current_date )
ORDER BY  `start_time`

-- Query Monthly

SELECT  `description` AS  'Task', DATE_FORMAT( current_date,  '%d %b %y' ) AS  'Current date',  `start_time` AS  'Time'
FROM tasks
WHERE  `code` LIKE  'monthly'
AND  `start_time` > current_time
AND  `exp_day` >= current_date
AND  `day_of_week` = DAYOFWEEK( current_date ) 
AND  `month_of_year` = MONTHNAME( current_date ) 
AND `frequency` = WEEKDAY (current_date)
ORDER BY  `start_time` 

-- Query Yearly - DONE

SELECT  `description` AS  'Task', DATE_FORMAT( current_date,  '%d %b %y' ) AS  'Current date',  `start_time` AS  'Time'
FROM tasks
WHERE  `code` LIKE  'yearly'
AND  `start_time` > current_time
AND  `exp_day` >= current_date
AND  `month_of_year` = MONTHNAME( current_date ) 
AND  `specific_day` = DAYOFMONTH( current_date ) 
ORDER BY  `start_time`



Как видите различие небольшое, каждый раз добавляется больше проверок полей и самое первое проверка кода.
Кто подскажет?
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38683914
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объединить вертикально? Тогда UNION ALL.
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38683925
Mc Doc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Можешь схематично (поблоково показать) как??

Есть пара примеров, но не до конца понятно как объеденить 5-ть.
http://www.w3resource.com/mysql/subqueries/index.php
http://www.mysqltutorial.org/mysql-subquery/
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38683965
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильные у вас ссылки. (голосом кота Матроскина )
Правильная такая - http://dev.mysql.com/doc/refman/5.5/en/union.html
Там же и примеры есть.
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38683993
Mc Doc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
Весельчак ))))
Как только заработает тут опублику.
Спасибо за ссылку!
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38684050
Mc Doc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
Еще раз спасибо!

Вот что вышло. Действительно, неверные ссылки были у меня.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
SELECT  `description`, DATE_FORMAT( current_date,  '%d %b %y' ),  `start_time`
FROM tasks
WHERE  `code` LIKE  'once'
AND  `start_date` = current_date
AND  `start_time` > current_time
AND  `exp_day` >= current_date
UNION
(SELECT  `description`, DATE_FORMAT(current_date,  '%d %b %y'),  `start_time`
FROM tasks
WHERE  `code` LIKE  'daily'
AND  `start_time` > current_time
AND  `exp_day` >= current_date)
UNION
(SELECT  `description`, DATE_FORMAT( current_date,  '%d %b %y' ),  `start_time`
FROM tasks
WHERE  `code` LIKE  'weekly'
AND  `start_time` > current_time
AND  `exp_day` >= current_date
AND 
(case 
 when `frequency` in (1,2,3,4,5) then `frequency` = WEEKDAY (current_date)
 when `frequency`=7 then true
 when `frequency`=6 then DAY(current_date)>DAY(date_add(current_date,interval 1 week))
 end))
UNION
(SELECT  `description`, DATE_FORMAT( current_date,  '%d %b %y' ),  `start_time`
FROM tasks
WHERE  `code` LIKE  'monthly'
AND  `start_time` > current_time
AND  `exp_day` >= current_date
AND  `day_of_week` = DAYOFWEEK( current_date ) 
AND  `month_of_year` = MONTHNAME( current_date ) 
AND 
(case 
 when `frequency` in (1,2,3,4,5) then `frequency` = WEEKDAY (current_date)
 when `frequency`=7 then true
 when `frequency`=6 then DAY(current_date)>DAY(date_add(current_date,interval 1 week))
 end))
UNION
(SELECT  `description`, DATE_FORMAT( current_date,  '%d %b %y' ),  `start_time`
FROM tasks
WHERE  `code` LIKE  'yearly'
AND  `start_time` > current_time
AND  `exp_day` >= current_date
AND  `month_of_year` = MONTHNAME( current_date ) 
AND  `specific_day` = DAYOFMONTH( current_date ))
ORDER BY  `start_time`
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38684056
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вам не нужны целенаправленно именно UNION, то лучше используйте UNION ALL. Будет заметно быстрее.
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38684059
Mc Doc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Лучше UNION так как проверка построчно, и поблоково для меня самое легкое и простое.
Так я на 100% уверен в каждом блоке.
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38684063
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И с case-ами вы что-то сложное сделали.
Попробуйте так:
Код: sql
1.
2.
3.
4.
5.
(
  (`frequency` in (1,2,3,4,5) AND `frequency` = WEEKDAY (current_date))
  OR (`frequency`=7)
  OR (`frequency`=6 AND DAY(current_date)>DAY(date_add(current_date,interval 1 week)))
)

Как будет быстрее - не скажу, надо пробовать.
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38684065
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mc Doc miksoft,

Лучше UNION так как проверка построчно, и поблоково для меня самое легкое и простое.
Так я на 100% уверен в каждом блоке.Тогда уж лучше как раз UNION ALL, т.к. просто UNION с хорошей вероятностью перемешает записи из разных блоков.
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38684082
Mc Doc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
Что то у меня РНР код не вписывается.Ошибку запроса показывает (((
Я для теста два блока объеденить решилдля начала.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
$result = mysqli_query($con, "SELECT description, start_time
			FROM tasks 
			WHERE code LIKE 'once'
			AND start_date = current_date
			AND start_time > current_time
			AND exp_day >= current_date
			ORDER BY start_time  
			UNION
				(SELECT  description, start_time
				FROM tasks
				WHERE  code LIKE  'daily'
				AND  start_time > current_time
				AND  exp_day >= current_date)
				ORDER BY  start_time  ");
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38684087
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый SELECT тоже в скобки возьмите.
Если не поможет, то показывайте полный текст сообщения об ошибке.
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38684091
Mc Doc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftПервый SELECT тоже в скобки возьмите.
Если не поможет, то показывайте полный текст сообщения об ошибке.
Не... все верно,
Я по запарке Два Ордера сделал )))))

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$result = mysqli_query($con, "SELECT description, start_time
			FROM tasks 
			WHERE code LIKE 'once'
			AND start_date = current_date
			AND start_time > current_time
			AND exp_day >= current_date
			UNION ALL
				(SELECT  description, start_time
				FROM tasks
				WHERE  code LIKE  'daily'
				AND  start_time > current_time
				AND  exp_day >= current_date)
				ORDER BY  start_time  ");



Сейчас буду по Блоку добавлять, что бы избежать ошибки.
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38684097
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mc Doc,

Я бы таки не советовал смешивать скобочную и бесскобочную записи SELECT-ов.
Это не запрещено синтаксисом, но может затруднить поддержку кода в будущем.
...
Рейтинг: 0 / 0
Объеденить 5 запросов в один
    #38684098
Mc Doc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftИ с case-ами вы что-то сложное сделали.
Попробуйте так:
Код: sql
1.
2.
3.
4.
5.
(
  (`frequency` in (1,2,3,4,5) AND `frequency` = WEEKDAY (current_date))
  OR (`frequency`=7)
  OR (`frequency`=6 AND DAY(current_date)>DAY(date_add(current_date,interval 1 week)))
)

Как будет быстрее - не скажу, надо пробовать.

Спасибо за все советы!
Все работает, и сейчас буду тестировать!
Еще раз спасибо за науку!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Объеденить 5 запросов в один
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]