Оптимизируйте MySQL запрос с помощью LEFT-OUTER-JOIN и GROUP BY - PullRequest
0 голосов
/ 13 марта 2012

У меня есть 2 таблицы с этой структурой:

CREATE TABLE `classi` (
  `nome` char(50) NOT NULL DEFAULT '',
  `padre` char(50) NOT NULL DEFAULT '',
  `prop` int(11) NOT NULL DEFAULT '0',
  `metodi` int(11) NOT NULL DEFAULT '0',
  `descrizione` text,
  PRIMARY KEY (`nome`),
  UNIQUE KEY `nome` (`nome`),
  UNIQUE KEY `padre` (`padre`,`nome`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `prop` (
  `classe` char(50) NOT NULL DEFAULT '',
  `nome` char(50) NOT NULL DEFAULT '',
  `tipo` char(1) NOT NULL DEFAULT '',
  `valori` text,
  `descrizione` text,
  PRIMARY KEY (`classe`,`nome`),
  UNIQUE KEY `speciale` (`classe`,`nome`),
  UNIQUE KEY `nome` (`classe`,`nome`),
 UNIQUE KEY `tipo` (`classe`,`tipo`,`nome`)
)

Вот правила для моего запроса:

  1. "classi" - это таблица MAIN, "prop" - это CHILDтаблица "classi" (отношение 1 к N на classi.nome -> prop.classe)
  2. Мне нужны ВСЕ записи в "classi" и ТОЛЬКО ПЕРВАЯ "СОВМЕСТНАЯ" ЗАПИСЬ "prop" (где prop.tipo = 'A', упорядочено по prop.tipo)
  3. Окончательный набор записей должен быть упорядочен по classi.nome

Это запрос, который я написал (и он работает):

SELECT c.nome, c.prop, c.metodi, p.nome AS pnome, p.tipo
FROM classi c
LEFT OUTER JOIN
 (SELECT nome, classe, tipo FROM prop ORDER BY tipo) p
 ON c.nome = p.classe
WHERE p.tipo = 'A'
GROUP BY c.nome
ORDER BY c.nome;

Итак, мой последний вопрос: возможно ли дополнительно оптимизировать этот запрос (например, избегая производной таблицы или другого предложения)?

ПожалуйстаУчтите, что любое решение должно быть после того, как оно применено на другом механизме БД (MSSQL, PostgreSQL, ecc.), поэтому мне нужно ANSI и переносимое решение (или «переводимое» решение).

Спасибозаранее за ваш ответ!

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

почему бы вам просто не сделать следующее:

SELECT c.nome, c.prop, c.metodi, p.nome AS pnome, p.tipo
FROM classi c
LEFT OUTER JOIN
 prop p
 ON c.nome = p.classe
WHERE p.tipo = 'A'
GROUP BY c.nome
ORDER BY c.nome;
0 голосов
/ 13 марта 2012

Почему бы просто

SELECT c.nome, c.prop, c.metodi, p.nome AS pnome, p.tipo
FROM classi c
JOIN prop p
 ON c.nome = p.classe
WHERE p.tipo = 'A'
ORDER BY c.nome;

Левое объединение не работает, потому что у вас есть условие для правой таблицы, и нет необходимости присоединяться к производной таблице, потому что условие позаботится о других записях проп.Кроме того, я не понимаю, как это может работать, если у вас есть группа, но большинство столбцов не сгруппированы и не агрегированы.

...