Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Избавиться от дублирующего подзапроса / 10 сообщений из 10, страница 1 из 1
06.09.2013, 15:45:27
    #38389252
clarkie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от дублирующего подзапроса
Всем привет. Помогите, пожалуйста, избавиться от второго подзапроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT `t`.`id` AS `t0_c0`,
       `t`.`invoice_id` AS `t0_c1`,
       `t`.`customer` AS `t0_c2`,
       `products`.`id` AS `t1_c0`,
       `products`.`name` AS `t1_c1`,
       `products`.`invoice_id` AS `invoice_id`,
       `statuses`.`id` AS `id`,
       `statuses`.`status_type` AS `status_type`,
       `statuses`.`entity_id` AS `entity_id`
FROM `invoices` `t`
LEFT OUTER JOIN `products` `products` ON (`products`.`invoice_id`=`t`.`id`)
LEFT OUTER JOIN `invoice_statuses` `statuses` ON (`statuses`.`entity_id`=`t`.`id`)
WHERE 4 <>
    (SELECT tmp.status_type
     FROM invoice_statuses tmp
     WHERE tmp.entity_id = `t`.`id`
     ORDER BY tmp.id DESC LIMIT 1)
  AND 0 <>
    (SELECT tmp.status_type
     FROM invoice_statuses tmp
     WHERE tmp.entity_id = `t`.`id`
     ORDER BY tmp.id DESC LIMIT 1) 
ORDER BY t.id ASC


Код: sql
1.
tmp.status_type

Два раза выбирается один и тот же, как его можно сравнить сразу и с тем значением, и с тем? Или запомнить?
...
Рейтинг: 0 / 0
06.09.2013, 15:48:46
    #38389257
clarkie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от дублирующего подзапроса
Забыл: работаю с php фреймворком, мне доступно всё, что в блоке WHERE, остальное трогать не хотелось бы, так как генерируется с помощью ActiveRecord.
...
Рейтинг: 0 / 0
06.09.2013, 15:48:58
    #38389259
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от дублирующего подзапроса
Код: sql
1.
2.
3.
4.
WHERE (SELECT tmp.status_type
     FROM invoice_statuses tmp
     WHERE tmp.entity_id = `t`.`id`
     ORDER BY tmp.id DESC LIMIT 1) NOT IN (0,4)
...
Рейтинг: 0 / 0
06.09.2013, 15:50:48
    #38389262
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от дублирующего подзапроса
Код: sql
1.
2.
3.
4.
WHERE (SELECT tmp.status_type NOT IN (0,4)
     FROM invoice_statuses tmp
     WHERE tmp.entity_id = `t`.`id`
     ORDER BY tmp.id DESC LIMIT 1)


Код: sql
1.
2.
3.
4.
WHERE (SELECT tmp.status_type IN (0,4)
     FROM invoice_statuses tmp
     WHERE tmp.entity_id = `t`.`id`
     ORDER BY tmp.id DESC LIMIT 1) = 0



По быстродействию все варианты, скорее всего, буду одинаковыми, но, на всякий случай, попробуйте.
...
Рейтинг: 0 / 0
06.09.2013, 15:54:05
    #38389267
clarkie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от дублирующего подзапроса
Работает как надо и быстрее, благодарю!
...
Рейтинг: 0 / 0
06.09.2013, 15:54:59
    #38389269
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от дублирующего подзапроса
clarkie,

а индексы-то все есть, которые нужны?
...
Рейтинг: 0 / 0
06.09.2013, 16:17:46
    #38389330
clarkie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от дублирующего подзапроса
miksoft , не знаю, какие нужны, сейчас такие:

invoices
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `invoices` (
	`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	`invoice_id` INT(11) UNSIGNED NOT NULL,
	`customer` VARCHAR(150) NOT NULL,
	`manager_id` INT(11) UNSIGNED NULL DEFAULT NULL,
	`stockman_id` INT(11) NULL DEFAULT NULL,
	`info` TEXT NULL,
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB



products
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE `products` (
	`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(255) NOT NULL,
	`invoice_id` INT(11) UNSIGNED NOT NULL,
	`quantity` INT(11) UNSIGNED NOT NULL,
	`owner_id` INT(10) UNSIGNED NULL DEFAULT NULL,
	PRIMARY KEY (`id`),
	INDEX `invoice` (`invoice_id`),
	CONSTRAINT `invoice` FOREIGN KEY (`invoice_id`) REFERENCES `invoices` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB



invoice_statuses
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `invoice_statuses` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`status_type` INT(10) UNSIGNED NOT NULL,
	`entity_id` INT(10) UNSIGNED NULL DEFAULT NULL,
	`timestamp` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	PRIMARY KEY (`id`),
	INDEX `Index 2` (`entity_id`),
	CONSTRAINT `FK_invoice_statuses_invoices` FOREIGN KEY (`entity_id`) REFERENCES `invoices` (`id`) ON UPDATE SET NULL ON DELETE SET NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
...
Рейтинг: 0 / 0
06.09.2013, 16:22:37
    #38389335
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от дублирующего подзапроса
clarkie,

у одного инвойса много статусов бывает в среднем?
...
Рейтинг: 0 / 0
06.09.2013, 16:27:50
    #38389350
clarkie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от дублирующего подзапроса
miksoft,

Обычно штук 10, может до 100 дойти.
...
Рейтинг: 0 / 0
06.09.2013, 16:48:50
    #38389395
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от дублирующего подзапроса
clarkiemiksoft,

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


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