varias tablas soporta segundo por optimizar lentas inner cuantas consultas consulta mysql

tablas - Seleccionar mĂșltiples columnas/campos en la subconsulta de MySQL



optimizar consultas lentas mysql (1)

Básicamente, hay una tabla de atributos y una tabla de traducción, muchas traducciones para un atributo.

Necesito seleccionar el id y el valor de la traducción para cada atributo en el idioma especificado, incluso si no hay un registro de traducción en ese idioma. O me falta alguna técnica de unión o join (sin incluir la tabla de idiomas) no funciona aquí ya que los siguientes atributos no se devuelven con traducciones no existentes en el idioma especificado.

select a.attribute, at.id, at.translation from attribute a left join attributeTranslation at on a.id=at.attribute where al.language=1;

Así que estoy usando subconsultas como esta, el problema aquí es hacer dos subconsultas en la misma tabla con los mismos parámetros (se siente como drain de rendimiento a menos que mysql agrupe esos, lo cual dudo ya que hace que haga muchas subconsultas similares)

select attribute, (select id from attributeTranslation where attribute=a.id and language=1), (select translation from attributeTranslation where attribute=a.id and language=1), from attribute a;

Me gustaría poder obtener la identificación y la traducción de una consulta, así que concatto columnas y obtengo la identificación de la cadena más tarde, que al menos está haciendo una subconsulta individual, pero todavía no está bien.

select attribute, (select concat(id,'';'',title) from offerAttribute_language where offerAttribute=a.id and _language=1 ) from offerAttribute a

Entonces la parte de la pregunta. ¿Hay alguna manera de obtener varias columnas de una única subconsulta o debo usar dos subconsultas (mysql es lo suficientemente inteligente como para agruparlas?) O se une de la siguiente manera:

[[atributo al lenguaje] a la traducción] (unir 3 tablas parece peor rendimiento que la subconsulta).


Sí, usted puede hacer esto. El don que necesita es el concepto de que hay dos formas de sacar tablas del servidor de tablas. Una forma es ...

FROM TABLE A

La otra forma es

FROM (SELECT col as name1, col2 as name 2 FROM ...) B

Tenga en cuenta que la cláusula de selección y los paréntesis a su alrededor son una tabla, una tabla virtual.

Entonces, usando su segundo ejemplo de código (supongo que las columnas que espera recuperar aquí):

SELECT a.attr, b.id, b.trans, b.lang FROM attribute a JOIN ( SELECT at.id AS id, at.translation AS trans, at.language AS lang, a.attribute FROM attributeTranslation at ) b ON (a.id = b.attribute AND b.lang = 1)

Tenga en cuenta que su attribute tabla real es la primera tabla en esta combinación, y que esta tabla virtual a la que he llamado b es la segunda.

Esta técnica es especialmente útil cuando la tabla virtual es una tabla de resumen de algún tipo. p.ej

SELECT a.attr, b.id, b.trans, b.lang, c.langcount FROM attribute a JOIN ( SELECT at.id AS id, at.translation AS trans, at.language AS lang, at.attribute FROM attributeTranslation at ) b ON (a.id = b.attribute AND b.lang = 1) JOIN ( SELECT count(*) AS langcount, at.attribute FROM attributeTranslation at GROUP BY at.attribute ) c ON (a.id = c.attribute)

Mira cómo va eso? Ha generado una tabla virtual c contiene dos columnas, la ha unido a las otras dos, ha utilizado una de las columnas de la cláusula ON y ha devuelto la otra como columna en su conjunto de resultados.