1
votes

MySQL ORDER BY (Colonne2 + Colonne3) si Colonne1 est vide?

J'ai une table CLIENTS comme celle-ci:

SELECT * FROM CLIENTS ORDER BY NEWCOLUMN

En fait, j'ai un script PHP qui renvoie des résultats SELECT * FROM CLIENTS ORDER BY Company ASC . Pour récupérer les résultats par ordre alphabétique ASC

Les résultats sont insérés (pour affichage) dans un tableau où la colonne NOM ou COMPANY est la Company (si compilée) ou Nom + Nom (si le nom et le prénom sont compilés)

<table>
   <tr>
     <th>NAME or COMPANY</th>
     <th>others info</th>
   </tr>
   <tr>
     <td>Doe John</td>
     <td> </td>
   </tr>
   <tr>
     <td>Yellow Jim</td>
     <td> </td>
   </tr>
   <tr>
     <td>Company 1</td>
     <td> </td>
   </tr>
   <tr>
     <td>Company 2</td>
     <td> </td>
   </tr>
   <tr>
     <td>Company 3</td>
     <td> </td>
   </tr>
</table>

TABLE:

<?php
foreach ( $row as $res )
if ( $res['Company'] != "" ) { echo $res['Company']; } else { echo $res['Surname'] . " " . $res['Name']; }
?>

Mais mon résultat est incorrect à cause des 2 enregistrements avec une valeur Company vide

Company n'est pas un champ obligatoire: si Company code> est vide, alors je dois compiler les champs Nom et Nom .

Dans ce cas, je dois modifier mon script pour revenir par un nouvelle colonne dynamique basée sur ce contrôle: si Société est compilée alors NEWCOLUMN = Société else NEWCOLUMN = Nom + "" + Nom puis

------------------------------------------------
| ID |  Name     |   Surname   |    Company    |
------------------------------------------------
|  1 |  John     |      Doe    |               |
------------------------------------------------
|  2 |           |             |     Company 1 |
------------------------------------------------
|  3 |   Mark    |   Blue      |     Company 2 |
------------------------------------------------
|  4 |           |             |     Company 3 |
------------------------------------------------
|  5 |     Jim   |   Yellow    |               |

Comment puis-je y parvenir?


1 commentaires

Comment connaître la relation entre un nom sans entreprise et une entreprise sans nom?


3 Réponses :


6
votes

Vous pouvez utiliser une expression CASE pour créer la nouvelle valeur de colonne:

SELECT *,
       CASE WHEN Company != '' THEN Company
            ELSE CONCAT(Surname, " ", Name) 
       END AS newcolumn
FROM clients
ORDER BY newcolumn


1 commentaires

@GiuseppeLodiRizzini pas de soucis. Je suis heureux d'avoir pu aider.



0
votes

Vous pouvez modifier la requête comme ceci:

SELECT if (company='', concat(Surname, " ", Name) , company) as NEWCOLUMN 
FROM clients ORDER BY NEWCOLUMN


0 commentaires

0
votes

Je suggérerais:

select coalesce(company_name, concat_ws(' ', surname, name)) as newname

Ceci a également l'avantage de pouvoir utiliser un index.

Si vous voulez la colonne:

order by company_name, surname, name

Cela suppose que "vide" signifie NULL.


0 commentaires