Foros del Web » Programando para Internet » PHP »

Condición WHERE variable=(MAX(variable)) válida?

Estas en el tema de Condición WHERE variable=(MAX(variable)) válida? en el foro de PHP en Foros del Web. Estoy haciendo una tabla de clasificación de modo que conecte a la base de datos y seleccione la última temporada, he probado con la condición ...
  #1 (permalink)  
Antiguo 06/08/2011, 10:47
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 14 años
Puntos: 0
Condición WHERE variable=(MAX(variable)) válida?

Estoy haciendo una tabla de clasificación de modo que conecte a la base de datos y seleccione la última temporada, he probado con la condición WHERE TEMPORADA=(MAX(TEMPORADA)) pero creo que esa condición es para trabajar directamente en la MYSQL y no con PHP.
Gracias por la ayuda de antemano.
Os dejo el código completo por si el error está más adelante.

Código PHP:
$champ mysql_query("SELECT TEMPORADA, TIPO, NOMBRE, PG, PE, PP, (PG+PE+PP) AS PJ, (3*PG+PE) AS PUNTOS, GF, GC, (GF-GC) AS DIF FROM EQUIPOS WHERE TEMPORADA=(MAX(TEMPORADA)) ORDER BY PUNTOS DESC"$link);

echo 
"<table>";
echo 
"<tr>";
echo 
"<td>Pos</td>";
echo 
"<td>Equipo-Grupo B</td>";
echo 
"<td>PJ</td>";
echo 
"<td>PG</td>";
echo 
"<td>PE</td>";
echo 
"<td>PP</td>";
echo 
"<td>GF</td>";
echo 
"<td>GC</td>";
echo 
"<td>Dif</td>";
echo 
"<td>Puntos</td>";
echo 
"</tr>";
$i=1;
while (
$row = @mysql_fetch_row($champ)){
echo 
"<tr>";
echo 
"<td>".$i."</td>";
echo 
"<td>".$row[2]."</td>";
echo 
"<td>".$row[6]."</td>";
echo 
"<td>".$row[3]."</td>";
echo 
"<td>".$row[4]."</td>";
echo 
"<td>".$row[5]."</td>";
echo 
"<td>".$row[8]."</td>";
echo 
"<td>".$row[9]."</td>";
echo 
"<td>".$row[10]."</td>";
echo 
"<td>".$row[7]."</td>";
echo 
"</tr>";
$i++;
}

echo 
"</table>"
  #2 (permalink)  
Antiguo 06/08/2011, 10:49
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Condición WHERE variable=(MAX(variable)) válida?

es SQL en efecto, y la función MAX solo funciona junto con la clausula GROUP BY, consulta un manual de SQL
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 06/08/2011, 10:50
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Condición WHERE variable=(MAX(variable)) válida?

No se pueden poner funciones MySQL en el WHERE. Tienes que pasarlo a la selección de campos, algo así:
"SELECT MAX(TEMPORADA) AS TEMP_MAX, TEMPORADA, TIPO, NOMBRE, PG, PE, PP, (PG+PE+PP) AS PJ, (3*PG+PE) AS PUNTOS, GF, GC, (GF-GC) AS DIF FROM EQUIPOS WHERE TEMPORADA=TEMP_MAX) ORDER BY PUNTOS DESC"

Un saludo.

Edito: ahora dudo si es verdad, después de lo que ha dicho @maycolalvarez. Si no, tendrás que separarlo en dos consultas, una para sacar el MAX y otra para hacer tu consulta actual. También lo puedes hacer en la misma, con subconsultas, algo así:
"SELECT TEMPORADA, TIPO, NOMBRE, PG, PE, PP, (PG+PE+PP) AS PJ, (3*PG+PE) AS PUNTOS, GF, GC, (GF-GC) AS DIF FROM EQUIPOS, (SELECT MAX(TEMPORADA) AS TEMP_MAX FROM EQUIPOS GROUP BY TEMPORADA) SUBSELECT WHERE EQUIPOS.TEMPORADA=SUBSELECT.TEMP_MAX) ORDER BY PUNTOS DESC"

Pruébalo bien, sé que se puede, pero no puedo ponerme a comprobarlo
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?

Última edición por vgonga1986; 06/08/2011 a las 10:54 Razón: Ahora dudo si es verdad
  #4 (permalink)  
Antiguo 06/08/2011, 11:11
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 14 años
Puntos: 0
Respuesta: Condición WHERE variable=(MAX(variable)) válida?

Gracias a los 2, pero no me funciona ni con una ni con otra, quitando los paréntesis que se te han quedado por ahí colgados :(
  #5 (permalink)  
Antiguo 06/08/2011, 11:18
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Condición WHERE variable=(MAX(variable)) válida?

Hola,

Cita:
Iniciado por maycolalvarez Ver Mensaje
es SQL en efecto, y la función MAX solo funciona junto con la clausula GROUP BY, consulta un manual de SQL
En MySQL es diferente ese concepto de ANSI SQL. En MySQL no es obligatorio usar la clausula GROUP BY para MAX, aunque es implícito su funcionamiento.

Código MySQL:
Ver original
  1. SELECT TIPO, MAX(TEMPORADA) FROM EQUIPOS

En ese caso solamente me va a mostrar el TIPO del primer registro y el valor máximo de TEMPORADA.

Cita:
Iniciado por sToRaGe Ver Mensaje
Código PHP:
$champ mysql_query("
SELECT TEMPORADA, TIPO, NOMBRE, PG, PE, PP, (PG+PE+PP) AS PJ, (3*PG+PE) AS PUNTOS, GF, GC, (GF-GC) AS DIF
FROM EQUIPOS WHERE TEMPORADA=(MAX(TEMPORADA)) ORDER BY PUNTOS DESC"
$link); 
Código:
SELECT TEMPORADA, TIPO, NOMBRE, PG, PE, PP, (PG+PE+PP) AS PJ, (3*PG+PE) AS PUNTOS, GF, GC, (GF-GC) AS DIF
FROM EQUIPOS WHERE TEMPORADA=(SELECT MAX(TEMPORADA) FROM EQUIPOS) ORDER BY PUNTOS DESC
Saludos,
  #6 (permalink)  
Antiguo 06/08/2011, 11:25
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Condición WHERE variable=(MAX(variable)) válida?

@HackmanC Y esto no funciona?
"SELECT TEMPORADA, TIPO, NOMBRE, PG, PE, PP, (PG+PE+PP) AS PJ, (3*PG+PE) AS PUNTOS, GF, GC, (GF-GC) AS DIF FROM EQUIPOS, (SELECT MAX(TEMPORADA) AS TEMP_MAX FROM EQUIPOS) SUBSELECT WHERE EQUIPOS.TEMPORADA=SUBSELECT.TEMP_MAX) ORDER BY PUNTOS DESC"

Se supone que si hago una tabla como subselect con un único valor y registro en el que venga el máximo, luego lo puedo usar en el where del select principal, no? Bueno, es por salir de dudas, todos los días se aprende algo nuevo.

@sToRaGe No se me han quedado ningunos paréntesis, son los de la subconsulta y renombre de la tabla:
FROM EQUIPOS, (SELECT MAX(TEMPORADA) AS TEMP_MAX FROM EQUIPOS GROUP BY TEMPORADA) SUBSELECT
Esto es:
FROM Tabla1, (subconsulta) Renombre_subconsulta

Un saludo.

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #7 (permalink)  
Antiguo 06/08/2011, 11:33
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Condición WHERE variable=(MAX(variable)) válida?

Hola,

Cita:
Iniciado por vgonga1986 Ver Mensaje
@HackmanC Y esto no funciona?
Se supone que si hago una tabla como subselect con un único valor y registro en el que venga el máximo, luego lo puedo usar en el where del select principal, no? Bueno, es por salir de dudas, todos los días se aprende algo nuevo.
No estoy seguro, es decir, en ANSI SQL creo que no lo sería, puesto que no podrías usar una columna calculada en la cláusula WHERE. Tendría que poner la sub-consulta tanto en la lista de campos como en el WHERE. La forma como lo escribí es compatible con la mayoría de bases de datos que permiten sub-consultas.

Realmente hay detalles que se me olvidan a veces, principalmente cuando estoy cotejando contra especificaciones, inclusive la función de agregado MAX no recuerdo exactamente si en ANSI es necesario usar la clausula GROUP BY.

Pero bueno, yo lo haría como lo mostré, creo que tiene algunas ventajas adicionales.

Saludos,
  #8 (permalink)  
Antiguo 06/08/2011, 11:33
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 14 años
Puntos: 0
Respuesta: Condición WHERE variable=(MAX(variable)) válida?

Creo que te sobraba ese paréntesis marcado en rojo.
Cita:
Iniciado por vgonga1986 Ver Mensaje
"SELECT TEMPORADA, TIPO, NOMBRE, PG, PE, PP, (PG+PE+PP) AS PJ, (3*PG+PE) AS PUNTOS, GF, GC, (GF-GC) AS DIF FROM EQUIPOS, (SELECT MAX(TEMPORADA) AS TEMP_MAX FROM EQUIPOS GROUP BY TEMPORADA) SUBSELECT WHERE EQUIPOS.TEMPORADA=SUBSELECT.TEMP_MAX) ORDER BY PUNTOS DESC"
Esto funciona perfectamente:
Cita:
Iniciado por HackmanC Ver Mensaje
Código:
SELECT TEMPORADA, TIPO, NOMBRE, PG, PE, PP, (PG+PE+PP) AS PJ, (3*PG+PE) AS PUNTOS, GF, GC, (GF-GC) AS DIF
FROM EQUIPOS WHERE TEMPORADA=(SELECT MAX(TEMPORADA) FROM EQUIPOS) ORDER BY PUNTOS DESC
Saludos,
Muchas gracias a todos!
  #9 (permalink)  
Antiguo 06/08/2011, 11:39
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Condición WHERE variable=(MAX(variable)) válida?

@HackmanC Ok, resuelto, gracias. A ver si me acuerdo y lo pruebo algún rato libre con varios motores de base de datos.

@sToRaGe Tienes razón, pensé que me decías los paréntesis de la subconsulta, ese sobra ;)

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #10 (permalink)  
Antiguo 06/08/2011, 18:03
 
Fecha de Ingreso: agosto-2011
Ubicación: Venezuela
Mensajes: 108
Antigüedad: 12 años, 9 meses
Puntos: 5
Respuesta: Condición WHERE variable=(MAX(variable)) válida?

o tambien puedes hacer una consulta donde los resultados te los de de manera desendente o sea de mayor a menor...y le pones un limit 1 para que te de solo el ultimo y ya :D
  #11 (permalink)  
Antiguo 08/08/2011, 20:10
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 14 años
Puntos: 0
Respuesta: Condición WHERE variable=(MAX(variable)) válida?

Otra cosa que no viene con el tema del post pero ya aprovecho.
¿Cómo hago para recibir el valor seleccionado del dorsal en recibe.php? ¿Es un array?

Código PHP:
echo "<form method='post' name='stats' id='stats' target='_top' action='recibe.php'>";
        echo
"<label>Dorsal</label>";
        echo
"<select name='dors' id='dors'>";

$result_dors mysql_query("SELECT DORSAL FROM JUGADORES ORDER BY DORSAL ASC"$link);
while (
$r_dors = @mysql_fetch_row($result_dors))
            {
                echo 
"<option value='".$r_dors[0]."'>".$r_dors[0]."</option>";
            } 
        echo
"</select>";
echo 
"<input type='submit' value='Mostrar' name='mostrar'>";
echo 
"</form>"
Quiero decir, si fuera <option value='".$r_dors."'>".$r_dors."</option> lo recibiría con un $r_d=$_POST['r_dors'] pero de la otra manera cómo sería?

Gracias nuevamente.
  #12 (permalink)  
Antiguo 09/08/2011, 02:15
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Condición WHERE variable=(MAX(variable)) válida?

Cita:
Iniciado por sToRaGe Ver Mensaje
Quiero decir, si fuera <option value='".$r_dors."'>".$r_dors."</option> lo recibiría con un $r_d=$_POST['r_dors'] pero de la otra manera cómo sería?
Esto es un error muy grande. No recibes con el valor, recibes con el name del select:
Código HTML:
Ver original
  1. <select name="ejemplo">
  2.     <option value="1">Paco</option>
  3.     <option value="2">Jose</option>
  4.     <option value="3">Juan</option>

El valor seleccionado lo tienes en $_POST['ejemplo'], donde vendrá 1 si se eligió Paco, 2 si se eligió Jose y 3 si se eligió Juan.

Esto es muy básico, si tienes problemas aquí, te aconsejo que mires un manual.

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #13 (permalink)  
Antiguo 09/08/2011, 04:54
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 14 años
Puntos: 0
Respuesta: Condición WHERE variable=(MAX(variable)) válida?

Dios mio vaya pájara.
Gracias, eran las horas... :S

Etiquetas: mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:57.