3

En MySQL poseo las siguientes tres tablas:

|Personas         |
-------------------
|dni_persona int  | 1
|nombre_persona   | Juan


|Empresas         |
-------------------
|dni_empresa      | 12345    54321
|nombre_empresa   | cocaloca pipse cola


|Personas_Empresas |
--------------------
|dni_persona_a     | 1     1
|dni_empresa_a     | 12345 54321

Si quisiera obtener a todas las personas y junto a ellas las empresas en las que pueden trabajar haria esto:

SELECT *
FROM personas_empresas as pe

   LEFT JOIN personas as p ON pe.dni_persona_a = p.dni_persona
   LEFT JOIN empresas as e ON pe.dni_empresa_a = e.dni_empresa

Regresando lo siguiente:

|dni_persona_a|dni_empresa_a|dni_persona|nombre_persona|dni_empresa|nombre_sa|
|1            |12345        |1          |Juan          |12345      |cocaloca |
|1            |54321        |1          |Juan          |54321      |pipseloca|  

¿Como puedo modificar la consulta para obtener solo una vez Juan pero en otra columna todas las empresas a la que este relacionado?

Para obtener lo siguiente:

|nombre_persona|dni_empresa|nombre_empresa|
|Juan          |12345      |cocaloca      |
|              |54321      |pipseloca     |

Nota:

1) Trate usando DISTINCT pero regresa igual repetidos los registros.

2) Use groupby nombre_persona y solo regresa un registro ejemplo juan cocaloca

Dev 200
  • 5,246
  • 5
  • 39
  • 80
  • ¿Qué motor de base de datos usas? – Phi Aug 24 '17 at 22:39
  • nop.. lo que planteas no se puede en una base de datos.. si en una view de algun lenguaje... – gbianchi Aug 24 '17 at 22:49
  • 2
    Lo ideal en estos casos es **obtener una sola fila** por resultado usando `GROUP BY` y juntar en alguna columna los diferentes valores usando `GROUP_CONCAT` y un separador. Luego, por programación, lees los valores agrupados haciendo `split` usando el separador indicado. **[Aquí tienes un ejemplo de lo que digo](http://rextester.com/OJIEJG33033)**, verás que la columna `totales` almacena varios datos usando `|` como separador. Eso te evita tener 7, 10, 20 ó 1,000 filas por cada dato de una misma persona. Puedes agrupar cuantas columnas quieras, o sea, grupos de empresas, de dni empresas, etc. – A. Cedano Aug 25 '17 at 02:05
  • 1
    El ejemplo anterior es relativo a [esta respuesta](https://es.stackoverflow.com/a/93455/29967), en el código de la misma hay un demo de ejemplo para PHP/MySQL. El demo muestra otras posibilidades interesantes de `GROUP_CONCAT`. – A. Cedano Aug 25 '17 at 02:14
  • @A.Cedano tomando en cuenta tu primer comentario, suponiendo que se tienen otras 2 cajas más y los totales son `id´s` de otra tabla (clientes), y ahora tomando en cuenta la primera tabla de los `select`, se mostrarían 4 con su respectiva informacion, pero ahora quiero mostrar todas las cajas por las cuales yo no pase, pase a la caja 1, quiero que se muestren las otras 3, **¿Ahí como seria la consulta?** – JuankGlezz Aug 25 '17 at 03:17
  • @JuankGlezz tuve que leer 3 veces tu comentario para tratar de entender tu duda, _creo_ entenderlo todo, excepto el final. O sea, ¿quisieras mostrar las `cajas` por las que no has pasado si he entendido bien? En ese caso, supongo que en alguna de las tablas habrá un campo que indique si pasaste o no... tendrías que aplicar un `WHERE` sobre ese campo. O sea, la consulta sería igual y tendría esto: `WHERE hapasado=FALSE`. – A. Cedano Aug 25 '17 at 03:46
  • @JuankGlezz Mira esto: https://stackoverflow.com/questions/44148003/show-only-one-time-a-repeat-record-and-all-of-the-other-different-elements-addin – Dev 200 Aug 25 '17 at 03:50
  • @A.Cedano Quisiera algo como la respuesta a esto pero siN PHP https://stackoverflow.com/questions/44148003/show-only-one-time-a-repeat-record-and-all-of-the-other-different-elements-addin – Dev 200 Aug 25 '17 at 03:50
  • Es prácticamente lo mismo que hace mi consulta @Victor-Random , sólo que yo presento los datos en forma horizontal, en forma de columnas, por requerimientos del OP (**[ver pregunta y respuesta](https://es.stackoverflow.com/a/93455/29967)**). Si cambias los `` por `` y modificas ligeramente el código PHP obtendrías el mismo resultado. – A. Cedano Aug 25 '17 at 03:53
  • @A.Cedano claro, cuando me pasaste el comentario lo revise, pero la duda mejor formulada seria como: es posible generar tablas con columnas impares, es decir N valores a la izquierda y M valores a la derecha? – Dev 200 Aug 25 '17 at 04:01
  • @A.Cedano mira he publicado una pregunta [Obtener todos los registros que no estén asociados con un id](https://es.stackoverflow.com/q/97366/6635), espero se aclare a lo que me referia – JuankGlezz Aug 25 '17 at 14:50

1 Answers1

2

La relación de las tablas, la deberías hacer de Personas > Personas_Empresa > Empresas, de esta forma tu query quedaría de la siguiente forma:

SELECT
    P.nombre_persona, E.dni_empresa, E.nombre_empresa
FROM Personas P
    INNER JOIN Personas_Empresas PE 
        ON P.dni_persona = PE.dni_persona
    INNER JOIN Empresas E
        ON PE.dni_empresa = E.dni_empresa

El resultado sería el siguiente:

+----------------+-------------+----------------+
| nombre_persona | dni_empresa | nombre_empresa |
+----------------+-------------+----------------+
| Juan           | 12345       | cocaloca       |
+----------------+-------------+----------------+
| Juan           | 54321       | pipse cola     |
+----------------+-------------+----------------+

Aquí puedes ver la demostración y sus resultados.

Nota: SQL tiene muchos sabores y entre uno y otro puede cambiar la sintaxis, por lo tanto será necesario que agregues la etiqueta del que utilizas actualmente. Algunos son SQL Server, MySQL Oracle, entre otros. El ejemplo expuesto funciona para SQL Server, pero creo que de igual forma te puede funcionar en otros motores de base de datos.

Phi
  • 9,913
  • 5
  • 25
  • 47
  • @Victor-Random el ejemplo lo puse respecto a la información que proporcionaste mi hermano. Si la información que tienes es diferente, será necesario ver los datos que estás manejando. ¿Viste el fiddler que puse? Ahí puedes hacer algunas pruebas y con eso vemos qué podemos mejorar del query ;) – Phi Aug 24 '17 at 23:44
  • Sorry no habia visto bien, ahora como hacemos para hacer un DISTINCT (que es lo que se me ocurre) de nombre_persona y dejar lo otro igual – Dev 200 Aug 24 '17 at 23:47
  • ¿Para qué requieres el `DISTINCT` bro? Ya con eso quedaría listo, no se podría simplificar más la consulta respecto al resultado que esperas – Phi Aug 24 '17 at 23:53
  • may broder, porque quisiera mostrar esa tabla pero sin repetir el dato de Juan, una vez lo hice pero usando codigo (esa vez PHP) quisiera saber si es posible solo con SQL – Dev 200 Aug 25 '17 at 00:10
  • @Victor-Random me temo que eso no será posible :( – Phi Aug 25 '17 at 00:20
  • Entiendo, ya revise donde tenia el codigo y lo hicimos comparando IDs y mostrando el registro. – Dev 200 Aug 25 '17 at 00:25