una ultimo tabla soporta segundo registro rapida por optimizar obtener mas lentas hacer cuantas consultas consulta como agilizar mysql sql database

mysql - ultimo - ¿Cómo obtener múltiples registros contra un registro basado en la relación?



optimizar consultas lentas mysql (8)

Tengo dos tablas Organización y Empleado con una relación de uno a muchos, es decir, una organización puede tener múltiples empleados. Ahora quiero seleccionar toda la información de una organización particular más el nombre de todos los empleados de esta organización. ¿Cuál es la mejor manera de hacerlo? ¿Puedo obtener todo esto en un solo conjunto de registros o tendré que obtener varias filas basadas en no? ¿de los empleados? Aquí hay una pequeña demostración gráfica de lo que quiero:

Org_ID Org_Address Org_OtherDetails Employess 1 132A B Road List of details Emp1, Emp2, Emp3.....


Como la pregunta está etiquetada como MySQL, debería poder utilizar una solución específica de MySQL, a saber, GROUP_CONCAT. Por ejemplo,

select Org_ID, Org_Address, Org_OtherDetails, GROUP_CONCAT(employees) as Employees from employees a, organization b where a.org_id=b.org_id group by b.org_id;


Esto es lo que puedes hacer, tienes 2 opciones:

select * FROM users u LEFT JOIN organizations o ON (u.idorg = o.id);

De esta manera obtendrá datos adicionales en cada fila, información completa de la organización que realmente no necesita.

O puedes hacer:

select o.*, group_concat(u.name) FROM users u LEFT JOIN organizations o ON (u.idorg = o.id) GROUP BY o.id

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

El segundo enfoque es aplicable si quieres ver, es decir. lista de nombres de usuario "usuario1, usuario2, usuario3", pero no desea operar en los campos ...


La respuesta corta es no".

Como se señala en otras respuestas, existen formas específicas de proveedores para lograr este resultado, pero no existe una solución SQL pura que funcione en una consulta.

Lo siento por eso :(

¿Presumiblemente una de las soluciones específicas del vendedor funcionará para usted?


Si usa Oracle, puede crear una función PL / SQL que pueda usar en su consulta que acepte un organization_id como entrada, y devuelva el primer nombre de todos los empleados que pertenecen a esa organización como una cadena. Por ejemplo:-

select o.org_id, o.org_address, o.org_otherdetails, org_employees( o.org_id ) as org_employees from organization o


Todo depende. Si te unes, obtienes todos los datos de la organización en cada fila. (1 fila por empleado). Eso tiene un costo. Si haces dos consultas. (Org y Emp) que tiene un costo diferente.

Elige tu veneno.


en MS SQL puedes hacer:

create function dbo.table2list (@input int) returns varchar(8000) as BEGIN declare @putout varchar(8000) set @putout = '''' select @putout = @putout + '', '' + <employeename> from <employeetable> where <orgid> = @input return @putout end

entonces hazlo:

select * from org, dbo.table2list(orgid) from <organisationtable>

Creo que también puedes hacerlo con COALESCE (), pero no puedo recordar la sintaxis en la parte superior de mi cabeza


Para SQL Server, los agregados SQLCLR de este proyecto están inspirados en el ejemplo del código de MSDN; sin embargo, funcionan mucho mejor y permiten la clasificación (como cadenas) y delimitadores alternativos si es necesario. Ofrecen una funcionalidad casi equivalente a GROUP_CONCAT de MySQL para SQL Server.

Puede encontrar una comparación completa de las ventajas / desventajas de los agregados CLR y la solución FOR XML en la documentación:

http://groupconcat.codeplex.com


La pregunta original era específica de la base de datos, pero quizás este es un buen lugar para incluir una respuesta más genérica. Es una pregunta común. El concepto que está describiendo a menudo se denomina ''Concatenación de grupo''. No hay una solución estándar en SQL-92 o SQL-99. Por lo tanto, necesitará una solución específica del proveedor.

  • MySQL - Probablemente la solución más simple. Use la función integrada GROUP_CONCAT. En tu ejemplo, querrías algo como esto:

select o.ID, o.Address, o.OtherDetails, GROUP_CONCAT( concat(e.firstname, '' '', e.lastname) ) as Employees from employees e inner join organization o on o.org_id=e.org_id group by o.org_id

  • PostgreSQL - EDIT: PostgreSQL 9.0 es igualmente simple ahora que string_agg (expresión, delimitador) está incorporado. Aquí está con ''coma-espacio'' entre los elementos:

select o.ID, o.Address, o.OtherDetails, STRING_AGG( (e.firstname || '' '' || e.lastname), '', '' ) as Employees from employees e inner join organization o on o.org_id=e.org_id group by o.org_id

PostgreSQL before 9.0 le permite definir sus propias funciones agregadas con CREATE AGGREGATE. Un poco más de trabajo que MySQL, pero mucho más flexible. Vea esta otra publicación para más detalles. (Por supuesto, PostgreSQL 9.0 y posteriores también tienen esta opción).

  • Oracle y MS SQL Server : crea un procedimiento almacenado que toma el org_id como su entrada y genera los nombres de los empleados concatenados. Luego use este procedimiento almacenado en su consulta. Algunas de las otras respuestas aquí incluyen algunos detalles sobre cómo escribir procedimientos almacenados como estos.

select o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees from organization o

  • Otras tecnologías DBMS : la ruta del procedimiento almacenado es la más probable. Quizás otros puedan actualizar esta respuesta con respuestas más específicas de la tecnología.