2009-12-16 1 views
1

J'ai une base de données avec la colonne VARCHAR url. Je voudrais chercher des lignes de sorte que ceux qui ont une valeur url ont la priorité sur les autres lignes, mais sont classés par date ligne (décroissant), donc ORDER BY 'url' DESC, 'date' DESC ne fonctionnerait pas car il les classerait par ordre alphabétique en premier. En gros, il ressemblerait à quelque chose comme ceci:Zend framework SQL sélectionner la construction de la requête (ORDER BY)

Tableau:

ID | Url | Date 
1 | http://...| 1001 
2 |   | 1002 
3 |   | 1003 
4 | http://...| 1005 
5 | http://...| 1004 

Classé:

ID | Url | Date 
4 | http://...| 1005 
5 | http://...| 1004 
1 | http://...| 1001 
3 |   | 1003 
2 |   | 1002 

Quelle serait la bonne façon zend framework (ou au moins la requête SQL) pour le faire?

Répondre

2

Avec SQL, vous pourriez donc quelque chose comme ...

Il se genre de laid si vous permettez des valeurs nulles sur le champ URL aussi bien.

SELECT * , IF(LENGTH(url) = 0 OR url IS NULL, 1, 0) AS nourl 
FROM url ORDER BY nourl ASC 

Ceci vérifie essentiellement si la longueur de l'URL est supérieure à zéro ou est nulle. Si elles le sont, elles sont au bas de l'échelle.

+0

Il est peut-être préférable d'utiliser l'instruction CASE car elle est conforme à la norme ANSI. De même, vous pouvez placer l'instruction case/if directement dans la clause ORDER by - vous n'avez donc pas besoin de sélectionner une colonne fictive – asgeo1

+0

Je peux y remédier. Je pense que j'ai toujours pensé à ceux-ci comme étant plus pour les procédures stockées. Personnellement, je le laisserais probablement toujours dans la liste des colonnes. Il pourrait être sympa de faire la logique sur la colonne nourl. –

0

Vous pouvez utiliser order by field('field_name', value) desc dans l'instruction select.

Questions connexes