powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация процедуры
10 сообщений из 10, страница 1 из 1
Оптимизация процедуры
    #38437555
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все привет, помогите оптимизировать процедуру:
Код: 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.
52.
53.
DROP PROCEDURE IF EXISTS `read` //
CREATE PROCEDURE  `read` (
	IN `ip` VARCHAR(255),
	IN `token` VARCHAR(255),
	IN `created` TIMESTAMP)
BEGIN
	SELECT COUNT(*)
	FROM `database`.`table`
	WHERE
		`id.ip` = `ip` AND
		`created` >= (NOW() - 86400)

	UNION ALL

	SELECT COUNT(*)
	FROM `database`.`table`
	WHERE
		`id.ip` LIKE CONCAT(SUBSTRING_INDEX(`ip`,'.',3), ".%") AND
		`created` >= (NOW() - 86400)

	UNION ALL

	SELECT `counter`
	FROM `database`.`table`
	WHERE
		`token` = `token` AND
		`created` >= (NOW() - 86400)

	UNION ALL

	SELECT SUM(`counter`)
	FROM `database`.`table`
	WHERE
		`id.ip` = `ip` AND
		`created` >= (NOW() - 86400)

	UNION ALL

	SELECT SUM(`counter`)
	FROM `database`.`table`
	WHERE
		`id.ip` LIKE CONCAT(SUBSTRING_INDEX(`ip`,'.',3), ".%") AND
		`created` >= (NOW() - 86400)

	UNION ALL

	SELECT
		`data`
	FROM `database`.`table`
	WHERE
		`token` = `token` AND
		`created` = `created`;
END //

на выходе данные типа:

resultINTINTINTINTTEXT
но хотелось бы получить в таком формате результат:

resultresultresultresultresultINTINTINTINTTEXT
спасибо!
...
Рейтинг: 0 / 0
Оптимизация процедуры
    #38437556
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nauseous,

а как быть с тем, что разные фрагменты могут возвращать разное количество записей?
...
Рейтинг: 0 / 0
Оптимизация процедуры
    #38437607
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftnauseous,

а как быть с тем, что разные фрагменты могут возвращать разное количество записей?

собственно так и надо, это свод по одной таблице, последний запрос возвращает строку,
все остальные, отдают количество
...
Рейтинг: 0 / 0
Оптимизация процедуры
    #38437611
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если есть варианты, то с радость рассмотрю ) спасибо
...
Рейтинг: 0 / 0
Оптимизация процедуры
    #38437640
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nauseousmiksoftnauseous,

а как быть с тем, что разные фрагменты могут возвращать разное количество записей?

собственно так и надоНе понял, поясните.
Не бывает так, чтобы в разных полях было разное количество записей.
...
Рейтинг: 0 / 0
Оптимизация процедуры
    #38437678
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
select 1 a
union all
select 2 b
union all
select 3 c;

прекрсно транспонируется за счет
Код: sql
1.
2.
3.
4.
select *
from(select 1 a) a
cross join(select 2 b)b
cross join(select 3 c)c;
...
Рейтинг: 0 / 0
Оптимизация процедуры
    #38437685
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опс... не заметил бред в последнем селекте, сорь, на картинки повелся... %\)
...
Рейтинг: 0 / 0
Оптимизация процедуры
    #38438096
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного по шаманил, вот что вышло:
Код: 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.
DROP PROCEDURE IF EXISTS `read` //
CREATE PROCEDURE  `read` (
	IN `ip` VARCHAR(255),
	IN `token` VARCHAR(255),
	IN `created` TIMESTAMP)
BEGIN
	SELECT
		a.`counter` AS "name-1",
		a.`data` AS "name-2",
		b.*, c.*, d.*, e.*
	FROM
		`database`.`table` AS a
		CROSS JOIN(
			SELECT SUM(`counter`) AS "name-3"
			FROM `database`.`table` AS b
			WHERE
				b.`ip` = `ip` AND
				b.`created` >= (NOW() - 86400)) AS b
		CROSS JOIN(
			SELECT SUM(`counter`) AS "name-4"
			FROM `database`.`table` AS c
			WHERE
				c.`ip` LIKE CONCAT(SUBSTRING_INDEX(`ip`,'.',3), ".%") AND
				c.`created` >= (NOW() - 86400)) AS c
		CROSS JOIN(
			SELECT COUNT(*) AS "name-5"
			FROM `database`.`table` AS d
			WHERE
				d.`ip` = `ip` AND
				d.`created` >= (NOW() - 86400)) AS d
		CROSS JOIN(
			SELECT COUNT(*) AS "name-6"
			FROM `database`.`table` AS e
			WHERE
				e.`ip` LIKE CONCAT(SUBSTRING_INDEX(`ip`,'.',3), ".%") AND
				e.`created` >= (NOW() - 86400)) AS e
	WHERE
		a.`token` = `token` AND
		a.`created` = `created;
END //

скажите можно такое без "CROSS JOIN (SELECT.." собрать?

Спасибо!
...
Рейтинг: 0 / 0
Оптимизация процедуры
    #38438124
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nauseous
Код: 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.
...
FROM
		`database`.`table` AS a
		CROSS JOIN(
			SELECT SUM(`counter`) AS "name-3"
			FROM `database`.`table` AS b
			WHERE
				b.`ip` = `ip` AND
				b.`created` >= (NOW() - 86400)) AS b
		CROSS JOIN(
			SELECT SUM(`counter`) AS "name-4"
			FROM `database`.`table` AS c
			WHERE
				c.`ip` LIKE CONCAT(SUBSTRING_INDEX(`ip`,'.',3), ".%") AND
				c.`created` >= (NOW() - 86400)) AS c
		CROSS JOIN(
			SELECT COUNT(*) AS "name-5"
			FROM `database`.`table` AS d
			WHERE
				d.`ip` = `ip` AND
				d.`created` >= (NOW() - 86400)) AS d
		CROSS JOIN(
			SELECT COUNT(*) AS "name-6"
			FROM `database`.`table` AS e
			WHERE
				e.`ip` LIKE CONCAT(SUBSTRING_INDEX(`ip`,'.',3), ".%") AND
				e.`created` >= (NOW() - 86400)) AS e
	WHERE
		a.`token` = `token` AND
		a.`created` = `created;
END //



это можно упростить так как-то
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
...
FROM
		`database`.`table` AS a
CROSS JOIN(
	SELECT 
		SUM(case when b.`ip` = `ip` AND b.`created` >= (NOW() - 86400) then `counter`end) AS "name-3",
		SUM(case when b.`ip` LIKE CONCAT(SUBSTRING_INDEX(`ip`,'.',3), ".%") AND b.`created` >= (NOW() - 86400)  then `counter`end) AS "name-4",
		SUM(case when b.`ip` = `ip` AND b.`created` >= (NOW() - 86400) then 1 end) AS "name-5",
		SUM(case when b.`ip` LIKE CONCAT(SUBSTRING_INDEX(`ip`,'.',3), ".%") AND b.`created` >= (NOW() - 86400) then 1 end) AS "name-6"

	FROM `database`.`table` AS b
) xz

	WHERE
		a.`token` = `token` AND
		a.`created` = `created;


а вот то, что выделенно - совсем не то, что вы считаете
b.`ip` = `ip` - это ИП, это НЕ ИП из таб а
...
Рейтинг: 0 / 0
Оптимизация процедуры
    #38438145
nauseous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112,

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


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