Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация процедуры / 10 сообщений из 10, страница 1 из 1
22.10.2013, 20:03:00
    #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
22.10.2013, 20:05:33
    #38437556
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация процедуры
nauseous,

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

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

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

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

собственно так и надоНе понял, поясните.
Не бывает так, чтобы в разных полях было разное количество записей.
...
Рейтинг: 0 / 0
22.10.2013, 22:35:47
    #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
22.10.2013, 22:41:09
    #38437685
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация процедуры
опс... не заметил бред в последнем селекте, сорь, на картинки повелся... %\)
...
Рейтинг: 0 / 0
23.10.2013, 11:55:06
    #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
23.10.2013, 12:12:33
    #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
23.10.2013, 12:24:13
    #38438145
nauseous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация процедуры
qwerty112,

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


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