No seleccionar campos vacios en mysql

3,623 views
Skip to first unread message

Andres Pinzon

unread,
Dec 7, 2005, 5:23:08 PM12/7/05
to sl-...@googlegroups.com
He estado buscando pero no lo encuentro,
¿Cómo puedo decirle a MySQL en una consulta que me seleccione todo menos los campos vacios?
Esto es lo que he hecho:
---------------------------------------
$consulta = "SELECT colorantes.*, usos.uso, usos.anio_aprob AS aprobacion, usos.obs_uso AS observaciones
                    FROM colorantes, usos
                    WHERE usos.codigo_fda= colorantes.codigo_fda
                    AND colorantes.id = '$formIDColorante'";
---------------------------------------
Pero muchos campos de la tabla colorantes estan vacios. Uso la siguiente funcion para mostrar los resultados:
---------------------------------------
function muestra_select($result){
       $tabla = "\n\t".'<table border="1" align="center" cellpadding="2" cellspacing="2">'."\n";
       for($i = 0; $i < mysql_num_fields($result); $i++)
       {
           $aux = mysql_field_name($result, $i);
           if (!empty($aux));
           {
           $tabla .= "\t\t<th>".$aux."</th>\n";
           }
       }
       while ($linea = mysql_fetch_array($result, MYSQL_ASSOC))
       {
           $tabla .= "\t\t<tr>\n";
           foreach ($linea as $valor_col)
           {
               $tabla .= "\t\t\t".'<td>'.$valor_col.'</td>'."\n";
           }
           $tabla .= "\t\t</tr>\n";
       }
       $tabla .= "\t</table>\n";
       return $tabla;
   }
-------------------------------------------
Pero me muestra todos estos resultados que no me interesan porque estan vacios. Sé que lo puedo hacer con PHP, pero prefiero que la consulta venga "limpia" desde el comienzo. ;-)

Gracias,
--
---------
Andrés Pinzón [http://www.andrespinzon.com]  
Bioinformatics Center, Colombia EMBnet node
Biotechnology Institute - National University of Colombia
http://bioinf.ibun.unal.edu.co
Tel +57 3165000 ext 16961 Fax +571 3165415
----------

Óscar López

unread,
Dec 9, 2005, 6:50:15 AM12/9/05
to sl-prog
Hola,

No me queda clara la pregunta, ¿cuáles "campos" vienen vacíos?;
¿podrías poner un ejemplo de cómo se ven los datos actualmente y
cómo quieres que se vean?.

La respuesta posiblemente sea usar en el WHERE `AND xyz IS NOT NULL' o
algo similar. Y por cierto ... esa función muestra_select() podría
mejorarse. Estás mezclando la lógica de recorrer un result set con la
lógica de mostrarlo como HTML.

-Óscar.

Andres Pinzon

unread,
Dec 9, 2005, 9:42:15 AM12/9/05
to sl-...@googlegroups.com


El día 9/12/05, Óscar López <oscar.and...@gmail.com> escribió:

Hola,

No me queda clara la pregunta, ¿cuáles "campos" vienen vacíos?;
¿podrías poner un ejemplo de cómo se ven los datos actualmente y
cómo quieres que se vean?.

La idea es que la tabla colorantes tiene +- 20 campos, pero no todos están siempre  llenos, por que no siempre existe toda la información para todos, de algunos se sabe su origen de otros no, de algunos otros se conoce su última revisión de otros no etc,. Lo que quiero hacer es  mostrar todos los campos de la tabla colorantes que no estan vacios. Algo así como:

SELECT * FROM colorantes WHERE campo != vacio

La respuesta posiblemente sea usar en el WHERE `AND xyz IS NOT NULL' o
algo similar. Y por cierto ... esa función muestra_select() podría
mejorarse. Estás mezclando la lógica de recorrer un result set con la
lógica de mostrarlo como HTML.


Ok, gracias por la sugerencia,  la verdad estoy usando Smarty [1] para la capa de presentación y la variable $tabla le llega a la plantilla HTML para que la muestre, es que si no es así tendría que poner alguna estructura de control en la plantilla y no me gusta. Pero aún así la función existe, creo que el problema está tambien en le nombre, debería llamarse "crear_tabla".  ¿crees que está mal crear la tabla con esta función?

[1] http://smarty.php.net/

Gracias por tu respuesta,

Óscar López

unread,
Dec 10, 2005, 7:52:16 PM12/10/05
to sl-prog
Hola,

Dudo que sea posible hacer lo que quieres directamente en una sola
consulta de SQL, porque tendríamos un Result Set donde cada fila tiene
un número variable de columnas, dependiendo de cuáles campos estén
vacíos. Además, las columnas que se retornan deben especificarse de
manera estática en el SELECT de la consulta, algo que no podríamos
hacer de antemano si quisiéramos retornar algunas columnas pero no
siempre todas.

Se podría hacer un procedimiento almacenado que lanze la consulta,
mire en el resultado qué columnas están vacías y después construya
dinámicamente la misma consulta, esta vez especificando las columnas
que nos interesan en el SELECT ... una solución bastante rebuscada, no
la recomendaría.

Definitivamente, lo que quieres hacer es más sencillo con PHP. Una
sugerencia más razonable va atada a mi comentario sobre el código que
enviaste. Yo dividiría la funcionalidad de `muestra_select()' en dos
funciones, una (en la capa de acceso a datos) que recorra el Result Set
y lo retorne en una estructura de datos (ej, una lista de filas donde
cada elemento es una lista de columnas) . Esto, sí y sólo si el
número de filas del Result Set es relativamente pequeño. La segunda
función (en la capa de presentación) recibiría dicha estructura de
datos y generaría dinámicamente el HTML, pintando sólo los campos
distintos de vacío, como los necesitas.

Si encuentras una mejor solución, ponla en este foro.

-Óscar.

Reply all
Reply to author
Forward
0 new messages