Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Ordenar por 2 campos juntos

Estas en el tema de Ordenar por 2 campos juntos en el foro de Bases de Datos General en Foros del Web. Estoy empezando a programar en PHP y para empezar quiero hacer una pagina que muestre letras. No es original, pero tengo ideas de varias cosas ...
  #1 (permalink)  
Antiguo 12/01/2011, 20:33
 
Fecha de Ingreso: enero-2011
Mensajes: 13
Antigüedad: 13 años, 3 meses
Puntos: 1
Ordenar por 2 campos juntos

Estoy empezando a programar en PHP y para empezar quiero hacer una pagina que muestre letras. No es original, pero tengo ideas de varias cosas que quiero implementar asi quede completa y de paso aprendo varias cosas distintas.

Me encontre con un pequeño inconveniente que no se como sortear. Tengo una tabla de "artistas", donde tiene 2 columnas, uno con el nombre y la otra con el apellido. Si en vez de un artista es una banda, tambien esta en esa tabla pero con el campo apellido = NULL.

Lo que quiero hacer es mostrar en una pagina todos los artistas que estan en una misma letra. Entramos a la letra L y estan por ejemplo La Renga, Los Piojos, Led Zepellin, Leo Garcia, Luis Miguel, etc. Pero tambien quiero que esten aquellos que el apellido empieza con L, por ejemplo John Lennon o bandas que empiezen con La, El, Los, The, etc y el nombre con L como The Libertines. Entonces, la pagina tendria que verse algo asi:

La Renga
Led Zepellin
Lennon, John
Leo Garcia
Libertines, The
Los Piojos
Luis Miguel

Para extraerlos habia pensado en algo asi:

select * from artistas where name like "l%" or apellido like "l%" or name like "the l%" or name like "los l%" or name like "la l%" or name like "las l%" or name like "el l%"

No se si eso asi tan largo esta bien, o se puede resumir un poco. Y lo que no tengo ni idea es como ordenarlos.

Muchas gracias de antemano por la respuesta.
  #2 (permalink)  
Antiguo 12/01/2011, 20:39
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Ordenar por 2 campos juntos

espera a que muevan tu tema al foro de base de datos, ya que tu problema no es de código php... es mas bien un problema de base de datos, lógica y sintaxis sql...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 12/01/2011, 21:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Tema movido desde PHP a Bases de Datos
  #4 (permalink)  
Antiguo 13/01/2011, 12:10
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Ordenar por 2 campos juntos

Hola solovoy,

Creo que te estás complicando la existencia cuando pudieras utilizar búsquedas de texto completo, pero bueno como dice el dicho al cliente lo que pida.

Si entendí bien tu tabla artistas más o menos tiene la siguiente información:

Código:
id|nombre|apellido
-------------------------------
1|La Renga|null
2|Led Zepellin|null
3|John|Lennon
4|Leo|Garcia
5|The Libertines|null
6|Los Piojos|null
7|Luis Miguel|null
8|Los Amantes de Lola|null
9|José Luis|Perales

Ahora bien, según entendí para el caso de John Lennon, quieres presentarlo como Lennon, John, lo mismo que para The Liberties (Liberties, The) y pongo un ejemplo con nombre y apellido con L intermedia: José Luis Perales, debería presentar Luis Perales, José.

Lo que se me ocurre es que hagas subconsultas para cada uno de los casos, y al final hagas la unión. de esta manera podrías armar el nombre tal y como quieras que se presente y ordenarlos al final, sería algo así.

Código MySQL:
Ver original
  1. select id, concat(nombre, if(apellido is not null, concat(' ', apellido), '')) as artista from Artistas where nombre like ('L%')
  2. select id, concat(apellido, ', ', nombre) as artista from Artistas where apellido like ('L%')
  3. select id,
  4. concat(substring(nombre, instr(nombre, ' L') + 1 , length(nombre)), if(apellido is not null, concat(' ', apellido), '') , ', ', substring(nombre, 1, instr(nombre, ' L') - 1)) as nombre
  5. from Artistas where instr(nombre, ' L') > 0 and nombre not like 'L%'
  6. order by artista

La consulta se construye con tres subconsultas,

-La primera obtiene todos los registros cuyo NOMBRE comience con L presenta nombre + apellido.

-La segunda obtiene los registros cuyo APELLIDO comience con L y presenta apellido + nombre

-La tercer es más complicada, primero busca si el nombre contiene alguna palabra que comience con ' L' es decir que alguna palabra intermedia en el nombre comienza con L, si es así entonces "voltea" la cadena, presentando primero la palabra que comienza con L y el apellido (si lo tuviera) y después el inicio de la cadena.

Para el caso de Los amantes de Lola, estoy filtrando los resultados para que no te los presente como (Lola, Los Amantes de)

Si hubiera algún detalle adicional que quieras considerar pues es cuestión de que lo integres como criterio de alguna de las consultas o como una consulta adicional.

el ejemplo está probado en MySQL, si utilizas algún otro Manejador sería cuestión de encontrar la sintaxis y las funciones respectivas.

Puede que exista alguna otra forma más sencilla de hacer esto, pero de primera es lo único que se me ocurrió.

Saludos
Leo
  #5 (permalink)  
Antiguo 13/01/2011, 13:33
 
Fecha de Ingreso: enero-2011
Mensajes: 13
Antigüedad: 13 años, 3 meses
Puntos: 1
Respuesta: Ordenar por 2 campos juntos

Gracias por la respuesta, es justo lo que queria. La 3º parte de la consulta la omiti, ya que solo en el caso de Jose Luis Perales solo tendria que aparecer en la J y en la P. No considero ponerlo en la L. El unico problema que le encontre a la consulta es que no omite los resultados repetidos. En el ejemplo que yo puse no se daria, pero en el caso de que haya un artista cuyo nombre y apellido empieze con la misma letra apareceria repetida. Por ej: Janis Joplin. La solucion de novato que yo habia encontrado es hacer consultas por separado, poniendo todos los resultados en un array para despues simplemente ordenar el array. Funciona como yo quiero, pero no estoy seguro si es preferible en razones de optimizacion si es preferible que el ordenamiento lo haga MySQL o PHP. El codigo que estoy usando ahora es el siguiente:

Código PHP:
function buscar_artistas() {
$consulta "select nombre,apellido,a_Id from artistas where apellido like '$l%'";

$artistas mysql_query($consulta);

$artarray = array();

while (
$row mysql_fetch_array($artistas)) {
    
$artarray[$row[a_Id]] = $row[apellido].', '.$row[nombre];
}

$consulta "select nombre,apellido,a_id from artistas where nombre like '$l%'";

$artistas mysql_query($consulta);

while (
$row mysql_fetch_array($artistas)) {
    
$artarray[$row[a_id]] = $row[nombre].' '.$row[apellido];
}

sort($artarray);

foreach (
$artarray as $key => $value) {
    echo 
"<li><a href='artista.php?id=".$key."'>".$value."</a></li>";
}

Muchas gracias por la respuesta.
  #6 (permalink)  
Antiguo 13/01/2011, 15:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Ordenar por 2 campos juntos

Para el caso que comentas de que duplica Janis Joplin, lo único que tienes que hacer es agregar una condición a la segunda consulta

Código:
SELECT id, CONCAT(apellido, ', ', nombre) as artista 
FROM Artistas 
WHERE apellido LIKE ('J%') 
AND Nombre not like 'J%' 
Es decir, si el nombre y el apellido comienzan con la misma letra se va a ir por el primer Select (el de nombre), El segundo se ejecutaría como una especie de IF-ELSE.

En el caso de la tercer consulta, para el caso de José Luis Perales, por ejemplo si buscas por la letra J te regresaría José Luis Perales, si buscas por la letra L te regresa Luis Perales, José y si buscas por Perales te regresa Perales, José Luis. Lo mismo ocurre con The Liberties, Si buscas por la letra L te regresa Liberties, The, pero si buscas por la letra T te regresa The Liberties.

En cuanto a lo que sea mejor, pues eso lo decides tú en base al rendimiento. En lo particular no me grada mucho la idea de utilizar arreglos y después ordenarlos, pues haces doble trabajo. Pero te repito esa es decisión tuya.

Saludos
Leo.

Etiquetas: campos
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 20:54.