2012-01-25 24 views
5

Estoy tratando de ordenar mi base de datos mysql haciendo referencia alfabéticamente a dos columnas donde nombre_empresa es el tipo principal, pero si no hay nombre_compañía, entonces ordena por apellido. Voy a enumerar un ejemplo a continuación.MYSQL - Clasificar 2 columnas Alfabéticamente, utilizando la segunda columna si la primera columna es nula

company_name: (columna tipo primario)
1 ABC Trucking
2 Genius Calefacción
4 Xtreme de Windows

last_name: (columna secundaria)
1 Bryant
2 Rogers
3 Flint
4 Lewis

géneros como este:
1 ABC de transporte de mercancias
3 Flint
2 Genius Calefacción
4 Xtreme de Windows

Es esto posible o debo combinar éstos en una matriz y ordenarlos usando PHP?

Respuesta

6

Simplemente haga una selección con una columna como 'nombre' usando una caja y ordene por ella. Mejor demostrado por el ejemplo.

SELECT 
CASE WHEN company_name IS NULL THEN last_name ELSE company_name END AS name 
FROM mytable 
ORDER BY name ASC 

Si realmente deseaba, también puede utilizar la declaración de caso directamente en el orden por cláusula.
Creo que lo anterior es realmente una mejor solución a su problema porque ya no tiene la lógica en el php, pero puede estar en desacuerdo.

SELECT company_name, last_name 
FROM mytable 
ORDER BY CASE WHEN company_name IS NULL THEN last_name ELSE company_name END ASC 

EDIT: sólo ha asumido company_name IS NULL es correcto para usted caso. Si necesita hacer esto en una condición diferente, entonces es su propio ejercicio. ¿Es nulo? ¿o debería estar comparándolo con ''?

+0

¿Puede el trabajo de casos cuando los campos están en blanco y no es nulo? –

+0

Puedo ir hacia atrás y hacer que el campo sea nulo si está vacío o puedo evaluarlo como ''. En este momento, el campo no es nulo, está vacío. –

+0

La condición es como si fuera a usarla en una cláusula 'where'. 'select * from tablename where company_name = ''', Si eso le proporciona todas las filas con company_names en blanco, entonces querrá usar 'company_name = ''' como condición. – user606723

1

Tomando prestado de la respuesta del usuario606723, pero mostrando cómo esto se implementa más comúnmente en MySQL, que es usar IFNULL().

IFNULL() devuelve la primera expresión, excepto cuando la primera expresión es nula, devolverá la segunda expresión. Está diseñado para este tipo de escenarios.

SELECT 
    IFNULL(company_name, last_name) AS name 
FROM mytable 
ORDER BY name 

Editar

Si company_name mantiene espacios en blanco en lugar de NULL, entonces usted puede hacer esto:

SELECT 
    IF(company_name <> '', company_name, last_name) AS name 
FROM mytable 
ORDER BY name 

Con una instrucción IF, si la primera expresión se evalúa como verdadera, entonces devuelve la segunda expresión; de lo contrario, devuelve la tercera expresión.

Si es posible que tenga nulo o en blanco, entonces esto va a trabajar:

SELECT 
    IF(company_name IS NOT NULL AND company_name <> '', company_name, last_name) AS name 
FROM mytable 
ORDER BY name 
+0

Tanto su ejemplo como 606723 casi funcionan. Siento que me estoy perdiendo algo pequeño. la salida se ve así. Ordena de la siguiente manera: 1 ABC Trucking 2 Genius Heating 4 Xtreme Windows falta la fila con solo el apellido. –

+0

Ah, no es NULO, está en blanco. Puede usar una declaración IF para eso. Estoy actualizando la respuesta ahora. –

+1

¿Hay realmente alguna ventaja en una declaración IF (o es realmente una función) como esta? Siento que las declaraciones de casos son más universalmente correctas. Honestamente veo esto como una mala práctica, pero tal vez soy ignorante de algo. – user606723

Cuestiones relacionadas