2012-01-25 2 views
5

J'essaie de trier ma base de données mysql en référençant deux colonnes par ordre alphabétique où company_name est le tri principal mais s'il n'y a pas de company_name alors trier par last_name. Je vais énumérer un exemple ci-dessous.MYSQL - Trier 2 colonnes Alphabétiquement, en utilisant la deuxième colonne si la première colonne est nulle

company_name: (colonne de tri primaire)
1 ABC Transport
2 Genius chauffage
4 Xtreme Fenêtres

nom_famille: (colonne secondaire)
1 Bryant
2 Rogers
3 Flint
4 Lewis

Sortes comme ceci:
1 ABC camionnage
3 Flint
2 Genius Chauffage
4 Xtreme de Windows

Est-ce même possible ou devrais-je fusionner simplement ceux-ci dans un tableau et les trier en utilisant php?

Répondre

6

Faites simplement une sélection avec une colonne en tant que «nom» en utilisant un cas et commandez-le. Meilleur montré par l'exemple.

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

Si vous le souhaitez, vous pouvez également utiliser l'instruction case dans la clause order by.
Je pense que ce qui précède est vraiment une meilleure solution à votre problème, car vous n'avez même plus la logique dans le php, mais vous pouvez ne pas être d'accord.

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

EDIT: Je ne suppose company_name IS NULL est correct pour vous cas. Si vous avez besoin de faire cela sur une condition différente, alors c'est votre propre exercice. Est-ce nul? ou devrait être le comparer à '' à la place?

+0

peut le travail CASE lorsque les champs sont vides et non nulle? –

+0

Je peux revenir en arrière et rendre le champ nul s'il est vide ou je peux l'évaluer comme ''. En ce moment le champ n'est pas nul son vide. –

+0

La condition est juste comme si vous alliez l'utiliser dans une clause 'where'. 'select * from nomtable où company_name = ''', Si cela vous donne toutes les lignes avec des noms de sociétés vides, alors vous devez utiliser 'company_name = ''' comme condition. – user606723

1

Empruntant la réponse de l'utilisateur606723, mais montrant comment ceci est plus communément implémenté dans MySQL, qui est d'utiliser IFNULL(). IFNULL() renvoie la première expression, sauf lorsque la première expression est nulle, elle renverra la deuxième expression.

Il est conçu pour ces types de scénarios.

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

Modifier

Si company_name détient des blancs au lieu de NULLs, vous pouvez le faire:

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

Avec une instruction IF, si la première expression est évaluée à vrai, alors il renvoie la deuxième expression, sinon, elle renvoie la troisième expression.

Si vous pourriez avoir NULL ou vide, cela fonctionnera:

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

Votre exemple et 606723 fonctionnent presque. J'ai l'impression de manquer quelque chose de petit. la sortie ressemble à ceci. Trie comme ceci: 1 ABC Trucking 2 Genius Chauffage 4 Xtreme Windows manquant la ligne avec seulement le nom de famille. –

+0

Ah, ce n'est pas NULL alors, c'est vide. Vous pouvez utiliser une instruction IF pour cela. Je suis en train de mettre à jour la réponse maintenant. –

+1

Y at-il vraiment un avantage à une instruction IF (ou est-ce vraiment une fonction) comme ça? J'ai l'impression que les déclarations de cas sont plus universellement correctes. Honnêtement, je considère cela comme une mauvaise pratique, mais peut-être que j'ignore quelque chose. – user606723

Questions connexes