Foros del Web » Programando para Internet » PHP »

¿Cómo podria engañar al ORDER BY campo ASC?

Estas en el tema de ¿Cómo podria engañar al ORDER BY campo ASC? en el foro de PHP en Foros del Web. Hola. Realmente, lo que quisiera saber, es como hacer para cuando imprimo de forma ASCENDENTE los valores de las filas, no me ponga al principio ...
  #1 (permalink)  
Antiguo 06/08/2007, 23:42
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Pregunta ¿Cómo podria engañar al ORDER BY campo ASC?

Hola.

Realmente, lo que quisiera saber, es como hacer para cuando imprimo de forma ASCENDENTE los valores de las filas, no me ponga al principio las que estan vacias, sino al final.

Me explico, si uno imprime ASC, por defecto, primero imprime los campos vacios y luego los llenos y esto es lo que no quiero, quisiera imprimir en forma ASC pero que no empieze con los campos vacios.

Como hago? alguna idea?

MUCHAS GRACIAS, como siempre!
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.

Última edición por SI TAN SOLO TUVIERA; 07/08/2007 a las 00:14
  #2 (permalink)  
Antiguo 07/08/2007, 07:58
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años, 1 mes
Puntos: 33
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Creo que tee sabran orientar mejor en el foro de base de datos.

Saludillos.
  #3 (permalink)  
Antiguo 07/08/2007, 08:18
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

No se, es algo que necesito hacer con php, por eso lo postee aqui. Casi todos los que saben php saben mysql muy bien.
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.
  #4 (permalink)  
Antiguo 07/08/2007, 08:32
Avatar de TolerantX  
Fecha de Ingreso: marzo-2006
Ubicación: Guadalajara, México.
Mensajes: 408
Antigüedad: 18 años, 1 mes
Puntos: 10
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

En Bases de datos te pueden ayudar mejor, el hecho de que lo hagas en php no tiene mucho que ver, ya que mandas la sentencia igual que si la hicieras en consola, solo la ingresarás en la función mysql_query()
__________________
TolerantX
http://tolerantx.com
Linux User #385226
  #5 (permalink)  
Antiguo 07/08/2007, 08:50
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Usá un alias para ordenar, y en el select un ifnull, ej:

Código PHP:
$sql "
select ifnull(tucampo,9999999999) mi_alias from tbl1 order by mi_alias
"

__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #6 (permalink)  
Antiguo 07/08/2007, 08:55
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Hola TolerantX.. bueno pues si tu lo dices, la verdad no se si los que saben mySQL bien, tambien sepan php.

La cosa es que estaba pensando algo asi, pero no se si pueda, o sea un machetazo.

Que el programa antes de imprimir haga el recorrido y si encuentra un campo vacio, a este le agregue un numero gigante 999999999999999, durante la sesion no mas y que luego si imprima con estos nuevos valores?


No se, si es algo tonto, mi experiencia es poca con todo esto, crees que podria ser una solucion?

Gracias!
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.
  #7 (permalink)  
Antiguo 07/08/2007, 08:58
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Cita:
Iniciado por nicolaspar Ver Mensaje
Usá un alias para ordenar, y en el select un ifnull, ej:

Código PHP:
$sql "
select ifnull(tucampo,9999999999) mi_alias from tbl1 order by mi_alias
"


Upsss!! creo que esto era lo que habia pensado???

Pero tengo una pregunta, no quiero que me modifique el valor "null" de la celda en la BD, unicamente que le agregue 99999999999 para esa sesion no mas,

Como tu dices pasaria eso nicolaspar? y gracias por el aporte!
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.
  #8 (permalink)  
Antiguo 07/08/2007, 09:14
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Solo para el query, no altera el valor en la db (para eso deberías updatear), luego desde php podrás si queres hacer un:

Código PHP:

if($rs['mi_alias'] === 9999999999) echo "este campo realmente es NULL"
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #9 (permalink)  
Antiguo 07/08/2007, 10:29
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Listo, voy a probar con los dos tips que me has tirado nicolaspar! si me enñuco, por aqui vuelvo a molestar

Te agradezco mucho!
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.
  #10 (permalink)  
Antiguo 08/08/2007, 19:59
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

oye nicolas par, me puedes echar una mano, he tratado varias cosas estupidas semejantes a esto:

Código HTML:
$sql = "SELECT
d.company,
c.member_id,
c.id,
c.year,
c.model,
c.type,
c.typemodel,
c.trans,
c.color,
IF (c.price=0,c.price=99999999999999,cprice=c.price) AS car_price, ...
Tambien intente con ifnull, pero ninguna me funciona...

Código HTML:
$sql = "SELECT 
			d.company,
			c.member_id,
			c.id,
			c.year,
			c.model,
			c.type,
			c.typemodel,
			c.trans,
			c.color,
			c.engine,
			c.drive,
			c.stock,
			c.millage,
			IFNULL(c.price,999999999999) AS car_price,
FROM ".$db_prefix.........

No he podido dar con eso, ya pregunte en el hilo de mysql, pero tampoco nadie!

Estoy en la olla!
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.

Última edición por SI TAN SOLO TUVIERA; 08/08/2007 a las 20:05
  #11 (permalink)  
Antiguo 08/08/2007, 20:35
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 8 meses
Puntos: 2114
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

¿Y si lo ordenas primero por un campo y luego por le que deba estar vacío?

Algo del tipo...
Código:
select uno,dos from tabla order by uno asc,dos desc
¿No te serviría?
  #12 (permalink)  
Antiguo 08/08/2007, 20:45
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Grax Bonez.

trato de que se impriman los datos empezando por el de valor ($precio) mas bajo que no es "0". Los que tengan NULL deben quedar al final.

Si mi objetivo fuese unicamente que los NULL quedaran al final, creo que me serviria, pero tengo que ordernarlo por el mismo campo, que es precio, no se si me hago entender, o sera que yo fui el que no te entendi?
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.
  #13 (permalink)  
Antiguo 08/08/2007, 20:52
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Cita:
AS car_price,
FROM
No decís porque no te funciona, pero esa coma esta de más.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #14 (permalink)  
Antiguo 08/08/2007, 21:02
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Despues de la coma siguen mas campos, no termina ahi, solo puse el FROM como referencia...

Cuando hago eso que te puse.. lo que pasa es que imprime todos los campo con valor NULL
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.
  #15 (permalink)  
Antiguo 08/08/2007, 21:07
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 10 meses
Puntos: 6
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Hola,

probaste a la hora de estar iterando sobre las filas agrupar los resultados que estan en blanco o null en una variable, y los que no en otra variable; entonces al momento de imprimir solo pones la variable con los campos vacíos al final. xD

Saludos.
  #16 (permalink)  
Antiguo 08/08/2007, 21:16
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Publico todo mi SELECT, la parte donde doy el ORDEN y la parte donde imprimo, a ver si ayuda a poner mas claras las cosas. De antemano les agradezco la paciencia.

el ORDER
Código:
if(!isset($HTTP_GET_VARS["SortCol"],$HTTP_GET_VARS["SortType"]))
{
	$SortCol = "c.price";
	$SortType = "ASC";

el SELEC
Código:
$sql = "SELECT 
			d.company,
			c.member_id,
			c.id,
			c.year,
			c.model,
			c.type,
			c.typemodel,
			c.trans,
			c.color,
			c.engine,
			c.drive,
			c.stock,
			c.millage,
			c.price,
			c.certified,
			c.comments,
			c.special,
			c.stored,
			IF(d.phone='','',CONCAT(SUBSTRING(d.phone,1,3),'-',SUBSTRING(d.phone,4,3),'-',SUBSTRING(d.phone,7,4))) AS dealer_phone, 			
                        d.zip,
			d.contact_name AS dealer_contact,
			st.state_code AS dealer_state,
			d.city,
			d.address AS dealer_address,
			d.website,
			CONCAT(d.contact_name) AS dealer_name,
			IF(TO_DAYS(NOW())-TO_DAYS(c.stored)<=7,'yes','no') AS is_new_car,
			d.featured AS dealer_featured,
			IF(rsr.id IS NULL,'no',rsr.id) AS results_stat_id
		FROM ".$db_prefix."cars AS c
		INNER JOIN ".$db_prefix."dealers AS d ON d.id=c.member_id
		LEFT JOIN ".$db_prefix."states AS st ON st.id = d.state_id
		LEFT JOIN ".$db_prefix."results_stat_report AS rsr ON (rsr.stock=c.stock AND rsr.member_id=c.member_id AND rsr.year = '".$stats_year."' AND rsr.month = '".$stats_month."')
		WHERE  
	    d.status='Active' AND
		(c.model LIKE '$model%' OR '$model'='')
		AND (c.price >= '$min_price' OR '$min_price'='')
	    AND (c.price <= '$max_price' OR '$max_price'='')
		".$filterType."
		".$filterKeyword."
		AND (d.city LIKE '%$city%' OR '$city'='')".
		//AND (d.zip LIKE '%$zip%' OR '$zip'='')
		$zipstring."
		AND (c.year >= '$min_year' OR '$min_year'='')
	    AND (c.year <= '$max_year' OR '$max_year'='')
		AND (c.member_id='$dealer_id' OR '$dealer_id'='')";
y donde imprimo el precio:

Código PHP:
 <?php 
if(number_format($row["price"])!=0
{
echo 
"$".number_format($row["price"]); 
}
else
{
echo 
"<div style=\"width:50px; color:#666666; font-size:9px; font-weight:bold; font-family: Verdana, Arial, Helvetica, sans-serif\">CALL<br><img src=\"images/call.gif\"><br>PLEASE</div>";
}
?>
Perdona la ignorancia, k4k4, pero, a ke te refieres con ITERANDO?
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.

Última edición por SI TAN SOLO TUVIERA; 08/08/2007 a las 21:34
  #17 (permalink)  
Antiguo 08/08/2007, 22:02
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 10 meses
Puntos: 6
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

tener un ciclo donde estemos procesando fila por fila, por ejemplo tengo una consulta y uso tu sql que esta en la variable $consulta:
Código PHP:
$filas_vacias '';
$filas_ordenadas_por_ASC '';

$resultado mysql_query($consulta);
while (
$fila mysql_fetch_assoc($resultado)) {
    if (empty(
$fila['campo']) or is_null($file['campo'])) {
        
$filas_vacias .= procesar($fila);
    } else {
        
$filas_ordenadas_por_ASC .= procesar($fila);
    }
}

// y al momento de imprimir los resultados solo pongo los vacíos al final
echo $filas_ordenadas_por_ASC $filas_vacias
Sólo espero no haberte confundido más. xD

Última edición por k4k4; 08/08/2007 a las 22:04 Razón: es ASC en lugar de DESC y error ortográfico
  #18 (permalink)  
Antiguo 09/08/2007, 00:49
 
Fecha de Ingreso: enero-2006
Mensajes: 293
Antigüedad: 18 años, 3 meses
Puntos: 4
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Mira, una recomendación que puedo darte es, que siempre que tengas un error en mysql con php, imprimas la variable de tu consulta, ya que tengas todos los datos, y tomes esa impresión y la corras en un manejador aparte. Eso me ha servido muchas veces.

Ahora, con respecto a tu problema.. he visto las soluciones que te han propuesto, que talvez no las hayas podido implementar por algun error de sintaxis, en eso no te puedo ayudar porque para mi son nuevas las soluciones que te han planteado también.

Pero una posible solución. ACLARANDO que no es la más óptima, sería hacer dos consultas, la primera filtrando el resultado a que no te regrese valores nulos y los ordenas ascendentemente o como quieras. y la segunda que te regrese todos los que tienen valor nulo en el campo que dices, y los imprimes abajo de los resultados anteriores.

Saludos
  #19 (permalink)  
Antiguo 09/08/2007, 08:27
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?



Esta chungo esto!

Les agradezco sus sugerencias! voy analizar bien el codigo que me paso k4, que creo que es lo mismo que sugiere osvier.

El problema que me blokea esta, en que no es un solo campo (price) el que imprimo, sino que son otros 24 mas y me confundo en como hacer lo que me dicen para uno solo aislando los otros 24 si todos dependen entre si!

De todos modos, voy a freir neuronas a ver que puedo hacer con el codigo que me paso k4.

Les agradezco mucho su colaboracion!
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.
  #20 (permalink)  
Antiguo 09/08/2007, 20:37
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Puuuuuuuuuuuuuuuuuuuuuuuude!!!

Jaja! de la manera mas mediocre e ineficaz pero funciona

Con PHP porque definitivamente hacerlo por medio de MySQL me quedo grande aun soy muy ignorante

Os cuento lo que hice, por si tienen alguna sugerencia o si de pronnnnto a alguien le sirve en un futuro.

En la pagina donde recojo los datos que pone el usuario:

Código PHP:
<input type="text" class="frm1" name="price" value="<?php if($price != "99999"){ if(is_numeric($price)){ echo "$".number_format($price,2);}else{ echo $price=""; }}?>">
Respecto a la casilla precio, hice esta validacion:

Código PHP:
if(!(chk($HTTP_POST_VARS['price'],"IsNotEmpty")))
        
$HTTP_POST_VARS['price']="99999";
    if(
$HTTP_POST_VARS['price']=="0")
        
$error_msg.= "- Please enter a numeric value different from zero, or leave the space empty<br>"
Si deja la casilla vacia, a la variable le asigno "99999" y este es el valor que sube a la BD. Si pone "0" no dejo que haga el UPDATE y lo obligo a poner un valor.


Y en la pagina donde imprimo los resultados, obviamente se va para el final la impresion de esta celda por ser la mas alta, pero como se supone que es un campo NULL, lo que hice fue decirle que si este campo tiene valor "99999" imprima un texto "LLAMAR".

Código PHP:
<?php 
if(number_format($row["price"])!=and $row["price"]!=99999)
{
echo 
"$".number_format($row["price"]); 
}
else
{
echo 
"<div style=\"width:50px; color:#666666; font-size:9px; font-weight:bold; font-family: Verdana, Arial, Helvetica, sans-serif\">CALL<br><img src=\"images/call.gif\"></div>";
}
?>

Creo que no es lo mas adecuado este machetazo, pero funciona

Gracias a todos por su colaboracion !! y creo por aqui estare volviendo con mas futuros problemas que nunca faltan!
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.
  #21 (permalink)  
Antiguo 09/08/2007, 22:13
 
Fecha de Ingreso: enero-2006
Mensajes: 293
Antigüedad: 18 años, 3 meses
Puntos: 4
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Yo decía algo así... aunque repito, no es lo más eficiente (porque tendrías que hacer dos consultas)

Código PHP:
$sql1='select campo1, campo2,campo3.... from tabla where campoX <> "" order by campoX ASC';
$result1=mysql_query($sql1);
while(
$row1=mysql_fetch_array($result1)){
     echo 
$row1["campo1"]."-".$row1["campo2"]."-".$row1["campo3"]."-"......$row1["campoX"];
}

//HASTA AQUI YA IMPRIMI LOS CAMPOS QUE NO ESTAN VACIOS....

//HAGO UNA NUEVA CONSULTA PARA LOS DATOS VACIOS

$sql2='select campo1, campo2,campo3.... from tabla where campoX == "" ';
$result2=mysql_query($sql2);
while(
$row2=mysql_fetch_array($result2)){
     echo 
$row2["campo1"]."-".$row2["campo2"]."-".$row2["campo3"]."-"......$row2["campoX"];
}
//AQUI IMPRIMO LOS QUE TIENEN VACIO EL CAMPOX 
Aunque como dije antes, no es una solución óptima. La opción proporcionada por k4 es mejor porque solo hace una consulta


saludos
  #22 (permalink)  
Antiguo 09/08/2007, 22:33
Avatar de SI TAN SOLO TUVIERA  
Fecha de Ingreso: marzo-2006
Ubicación: Aburrilandia, US
Mensajes: 652
Antigüedad: 18 años, 1 mes
Puntos: 3
Re: ¿Cómo podria engañar al ORDER BY campo ASC?

Si, tienes razon! entiendo el de k4, en terminos basicos, pero cuando trato de adaptarlo al chorrero de codigo que ya tengo creado me bloqueo, pero igual seguire intentando .

La solucion que postee que me funciona, la voy a dejar temporal mientras le cojo mas el hilo a MySQL y asimilo la solucion de k4, porque asi como lo tengo corre bien, y los primeros resultados me los muestra como quiero, pero tiene el problema, que si nuevamente el usuario le da manualmente SORT BY DESC, por ejemplo, va empezar imprimiendo por estos campos nulos, pero que en el fondo tienen el valor mas alto, y no deberia ser asi!!

Gracias de todos modos por tu aporte!
__________________
¿Dónde encontrar carros baratos en USA? En Autopten.
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 01:44.