Subconsulta con los resultados en un select

87 views
Skip to first unread message

Almudena Soblechero García

unread,
Jun 1, 2015, 10:40:26 AM6/1/15
to php...@googlegroups.com
Hola buenas tardes chicos, vuelvo a haceros una preguntilla de las mías....


Quiero hacer una subconsulta para que me devuelva los resultados, en un select.

La subconsulta es de dos tablas que están relaccionadas por el código del equipo,

La consulta la hago dentro de la consola sql que hay dentro del phpmyadmin y me devuelve el resultado correcto, pero si lo hago a través de php, no me muestra nada en el select.

Mi subconsulta sería la siguiente:

$consulta2="SELECT EQUIPO_DC.EQUIPO, JUGADOR_DC.JUGADOR, JUGADOR_DC.JUGADOR_id, JUGADOR_DC.MODALIDAD ";
$consulta2=$consulta2."FROM JUGADOR_DC,EQUIPO_DC ";
$consulta2=$consulta2."WHERE JUGADOR_DC.ACTIVADO =  'habilitado' ";
$consulta2=$consulta2."AND EQUIPO_DC.EQUIPO_id ";
$consulta2=$consulta2."IN ( SELECT EQUIPO_id FROM EQUIPO_DC ) ORDER BY EQUIPO_DC.EQUIPO ASC "; 

lo guardaría en una variable:

$resultado=mysqli_query($conexion, $consulta);

EL resultado lo quisiera recoger en este fecth:

/* while ($JUGADOR=mysqli_fetch_row($resultado))
{
$nombre_JUGADOR=$resultado['JUGADOR_DC.JUGADOR'];
$codigo_JUGADOR=$resultado['JUGADOR_DC.JUGADOR_id'];
$modalidad_JUGADOR=$resultado['JUGADOR_DC.MODALIDAD'];
$nombre_EQUIPO=$resultado['EQUIPO_DC.EQUIPO'];
if(strlen($modalidad_JUGADOR)==0)
echo "<option value=".$codigo_JUGADOR.">".ucwords($nombre_EQUIPO).":  ". ucwords($nombre_JUGADOR). "</option>";
else
echo "<option value=".$codigo_JUGADOR.">".ucwords($nombre_JUGADOR).":  ". ucwords($modalidad_JUGADOR). ", ". ucwords($modalidad_JUGADOR). "</option>";
} */

Antes lo tenía de esta forma, pero he de añadir lo de la EQUIPO:

$consulta='select * from JUGADOR_DC order by JUGADOR_id asc';

El fecth:

while ($JUGADOR=mysqli_fetch_row($resultado))
{
$nombre_JUGADOR=$JUGADOR[2];
$modalidad_JUGADOR=$JUGADOR['4'];
if(strlen($JUGADOR['4'])==0)
echo "<option value=".$JUGADOR[0].">".ucwords($nombre_JUGADOR)."</option>";
else
echo "<option value=".$JUGADOR[0].">".ucwords($nombre_JUGADOR).":  ". ucwords($modalidad_JUGADOR). "</option>";
}

¿Alguna sugerencia chicos?

Tordek

unread,
Jun 1, 2015, 6:52:42 PM6/1/15
to php...@googlegroups.com
Para evitar errores tontos que puedan surgir de concatenar una query
de esa manera, podés usar un heredoc o nowdoc:

$consulta2 = <<<SQL
SELECT EQUIPO_DC.EQUIPO, JUGADOR_DC.JUGADOR, JUGADOR_DC.JUGADOR_id,
JUGADOR_DC.MODALIDAD
FROM JUGADOR_DC,EQUIPO_DC
WHERE JUGADOR_DC.ACTIVADO = 'habilitado'
AND EQUIPO_DC.EQUIPO_id IN ( SELECT EQUIPO_id FROM EQUIPO_DC )
ORDER BY EQUIPO_DC.EQUIPO ASC
SQL;

Pero tu query es muy rara: "AND EQUIPO_DC.EQUIPO_id IN ( SELECT
EQUIPO_id FROM EQUIPO_DC )"

Estás... seleccionando todos los equipos cuyo ID esté entre los ID de
los equipos... o sea... todos los equipos. Esa línea no hace nada
(excepto filtrarte los equipos con id NULL de una manera super
ineficiente, pero sería demasiado raro que tengas equipos con ID
NULL).

Aparte, no estás haciendo coincidir los jugadores con los equipos;
tenés un producto cartesiano de todos los jugadores con todos los
equipos. (Aunque, bueno, no sé, a lo mejor querías exactamente eso).

Creo que lo que quisiste escribir era:

$consulta2 = <<<SQL
SELECT EQUIPO_DC.EQUIPO, JUGADOR_DC.JUGADOR, JUGADOR_DC.JUGADOR_id,
JUGADOR_DC.MODALIDAD
FROM EQUIPO_DC
JOIN JOIN_DC ON JUGADOR_DC.EQUIPO_id = EQUIPO_DC.EQUIPO_id
WHERE JUGADOR_DC.ACTIVADO = 'habilitado'
ORDER BY EQUIPO_DC.EQUIPO ASC
SQL;

Segundo, mysqli_fetch_row te devuelve un array ordenado, podés acceder
a los elementos de manera posicional (0 -> equipo, 1 -> jugador, etc);
pero en tu ejemplo estás intentando acceder a
$resultado['jugador_dc.jugador'], que no existe. Para eso necesitás
msyql_fetch_assoc. (Probá imprimir con var_dump($resultado) para ver
la forma de tus datos).




2015-06-01 11:40 GMT-03:00 Almudena Soblechero García
<almudena.c...@gmail.com>:
> --
> Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP
> Argentina" de Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus mensajes,
> envía un correo electrónico a php-arg+u...@googlegroups.com.
> Para publicar en este grupo, envía un correo electrónico a
> php...@googlegroups.com.
> Visita este grupo en http://groups.google.com/group/php-arg.
> Para acceder a más opciones, visita https://groups.google.com/d/optout.

Gabriel Divenuto

unread,
Jun 2, 2015, 7:19:50 AM6/2/15
to php...@googlegroups.com
Buen día Almudena, puede que me equivoque, pero estás armando la query en $consulta2 y luego en la línea:

$resultado=mysqli_query($conexion, $consulta); no tiene el mismo nombre, o sea, no se ejecuta la query.



Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.



--
Gabriel E. Divenuto
Web: www.sistemasgd.com

Almudena Soblechero García

unread,
Jun 3, 2015, 5:36:15 AM6/3/15
to php...@googlegroups.com
Buen día a todos chicos!!!!

Por partes, 

Gabriel, tenías razón, estaba haciendo mal la consulta query, la tenía comentada esa línea puesto que no me funcionaba:

//$resultado=mysqli_query($con, $consulta) or die(mysql_error()); --> esta me funcionaba pero solo era la consulta de los jugadores, no incluia el equipo.
$resultado=mysqli_query($con, $consulta2) or die(mysql_error()); --> esta es la que relacionaba ambas tablas ;) 

Tordek, también tenías razón la subconsulta la estaba haciendo mal, no relacionaba ambas tablas, 

       $consulta2=$consulta2."AND jugador_DC.equipo_id ";
       $consulta2=$consulta2."IN ( SELECT equipo_id FROM equipo_DC ) ORDER BY equipo_DC.equipo ASC "; 

Pero tengo una duda con respescto a lo que me dices con  dices que es muy rara, es simplemente para que a la hora de hacer el listado, me aparezcan primero el nombre del equipo y luego el nombre del jugador, si no las relaciono con una subconsulta el nombre del equipo no está en la misma tabla que los jugadores, el equipo de fútbol esta en una tabla y los jugadores en otra y se relaccionan ambas mediante el código, el campo deshabilitado es por si el jugador esté lesionado o sancionado.


Comprendo lo que dices de encadenar la consulta de ese modo, pero era para que la pudiera ver, entera en la pantalla del ordenador,  no entiendo lo que es un heredoc o newdoc...


ÇMuchas gracias de nuevo chicos!!!


El martes, 2 de junio de 2015, 13:19:50 (UTC+2), Gabriel escribió:
Buen día Almudena, puede que me equivoque, pero estás armando la query en $consulta2 y luego en la línea:

$resultado=mysqli_query($conexion, $consulta); no tiene el mismo nombre, o sea, no se ejecuta la query,

Almudena Soblechero García

unread,
Jun 3, 2015, 7:34:23 AM6/3/15
to php...@googlegroups.com
Buenas, no me termina de ir bien,  debido que de alguna forma de debe de saturar... y al final en vez de mostrar el nombre del equipo de cada uno de los jugadores, muestra el nombre de equipo que no lo corresponde... 

Tordek

unread,
Jun 3, 2015, 12:07:31 PM6/3/15
to php...@googlegroups.com
On 03/06/15 08:34, Almudena Soblechero García wrote:
> Buenas, no me termina de ir bien, debido que de alguna forma de debe de saturar... y al final en vez de mostrar el nombre del equipo de cada uno de los jugadores, muestra el nombre de equipo que no lo corresponde...
>

Repasá mi respuesta donde te explico que tu "and x = y" no hace lo que esperás, y como se hace con join. Te dejé la consulta completa.

La consulta que escribiste dice:

"AND jugador_DC.equipo_id IN (SELECT equipo_id from equipo_DC)".

Lo que estás haciendo ahí es:

1. consultás todos los equipos
2. para cada jugador, preguntás: "¿está el jugador está en uno de los equipos?". Y, sí, está en "alguno" de los equipos.

En otras palabras, lo único que estás haciendo ahí es descartar los jugadores que no estén en ningún equipo; tenés un producto cartesiano de todos los jugadores con todos los equipos.

De paso: ¿podés tener jugadores sin equipos? ¿equipos sin jugadores? y, en ese caso, ¿querés mostrarlos en esta consulta? necesitarás un left/right/full outer join, dependiendo de cada situación.

--
Guillermo O. «Tordek» Freschi. Programador, Escritor, Genio Maligno.
http://tordek.me :: http://twitter.com/tordek

Almudena Soblechero García

unread,
Jun 5, 2015, 6:48:42 AM6/5/15
to php...@googlegroups.com
Buenas, perdonad la demora en la respuesta,

HE de decirte que he hecho la consulta como me has dicho, y no aparece nada en la página....

$consulta2="SELECT EQUIPO_DC.EQUIPO, JUGADOR_DC.SERVICIO_id, JUGADOR_DC.SERVICIO, JUGADOR_DC.MODALIDAD ";
$consulta2=$consulta2."FROM JUGADOR_DC JOIN EQUIPO_DC ";
$consulta2=$consulta2."ON JUGADOR_DC.EQUIPO_id=EQUIPO_DC.EQUIPO_id"; 
$consulta2=$consulta2."WHERE JUGADOR_DC.ACTIVADO='habilitado' ";
$consulta2=$consulta2."ORDER BY EQUIPO_DC.EQUIPO ASC "

Respondiendo a las preguntas que me has hecho, si hay equipo sin jugadores, pero al contrario no, es decir, todo jugador, tiene asignado un equipo, y deseo mostrar sólo la lista de los jugadores, no de los equipos.

Con lo cual, según lo que me has comentado tu, ¿seria un full other join?

Muchas gracias ;)

Almudena Soblechero García

unread,
Jun 5, 2015, 6:52:52 AM6/5/15
to php...@googlegroups.com


Ya aparece algo :)   era un espacio...

Tordek

unread,
Jun 5, 2015, 12:31:26 PM6/5/15
to php...@googlegroups.com
Por eso mismo te recomendaba el heredoc/nowdoc en el primer mail ;)

$consulta2 = <<<QUERY
SELECT EQUIPO_DC.EQUIPO, JUGADOR_DC.SERVICIO_id, JUGADOR_DC.SERVICIO,
JUGADOR_DC.MODALIDAD
FROM JUGADOR_DC
JOIN EQUIPO_DC ON JUGADOR_DC.EQUIPO_id=EQUIPO_DC.EQUIPO_id
WHERE JUGADOR_DC.ACTIVADO='habilitado'
ORDER BY EQUIPO_DC.EQUIPO ASC
QUERY;

Esta sintaxis de poner...

<<<(algo)
... string
(algo);

te permite escribir una cadena sin tener que preocuparte por escapar
comillas ni concatenar nada.

Adicionalmente, no hace falta que pongas "$consulta2 = $consulta2 .
..."; podés usar la versión corta, ".="

$consulta2 = "SELECT EQUIPO_DC.EQUIPO, JUGADOR_DC.SERVICIO_id,
JUGADOR_DC.SERVICIO, JUGADOR_DC.MODALIDAD ";
$consulta2 .= "FROM JUGADOR_DC JOIN EQUIPO_DC ";
...

pero te recomiendo que uses la versión con heredoc, porque es mucho
más simple de leer.

2015-06-05 7:52 GMT-03:00 Almudena Soblechero García
<almudena.c...@gmail.com>:
>
>

Almudena Soblechero García

unread,
Jun 9, 2015, 6:42:52 AM6/9/15
to php...@googlegroups.com
:)


Perdona el retraso.

Muchas gracias por aconsejarme, tienes razón.

A la pregunta que te hice de hacer filtrado de full other?

Tordek

unread,
Jun 9, 2015, 3:17:44 PM6/9/15
to php...@googlegroups.com
2015-06-09 7:42 GMT-03:00 Almudena Soblechero García
<almudena.c...@gmail.com>:

> A la pregunta que te hice de hacer filtrado de full other?

No aplica.

Podés hacer 4 cosas: Inner join, left outer, right outer, y full outer.

Supongamos que tenés estos datos:

(idequipo, nombre) = (1, equipo1), (2, equipo2)
(idjugador, nombre, idequipo) = (1, jugador1, 1), (2, jugador2, null)

Es decir: El jugador 1 pertenece al equipo 1, el jugador 2 no
pertenece a ningún equipo, y el equipo 2 no tiene jugadores.

hacer...

SELECT *
FROM JUGADORES
INNER JOIN EQUIPOS ON EQUIPOS.idequipo = JUGADORES.idequipo

te devuelve:
(Todos los datos en formato (idequipo, equipo.nombre, idjugador,
jugador.nombre))

(1, equipo1, 1, jugador1)

Es decir: "solo los equipos que tengan jugadores y solo los jugadores
que tengan equipo".

LEFT OUTER JOIN te devolvería

(1, equipo1, 1, jugador1)
(null, null, 2, jugador2)

Es decir, todos los jugadores, tengan equipo o no, pero no los equipos
que no tengan jugador.

RIGHT OUTER JOIN te devuelve al revés del anterior:

(1, equipo1, 1, jugador1)
(2, equipo2, null, null)

Todos los equipos, tengan o no jugadores, pero no los jugadores que no
están en un equipo.

Y, finalmente, un FULL OUTER te da

(1, equipo1, 1, jugador1)
(2, equipo2, null, null)
(null, null, 2, jugador2)

Que corresponde a todos los jugadores, tengan asociado o no un equipo,
y viceversa.

Vos sabrás qué datos querés presentar de acuerdo a las distintas opciones.

Almudena Soblechero García

unread,
Jun 10, 2015, 5:27:06 AM6/10/15
to php...@googlegroups.com
Muchas gracias ;)

Has recibido este mensaje porque estás suscrito a un tema del grupo "Grupo PHP Argentina" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/php-arg/is_VgRHgV8s/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a php-arg+u...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages