order by et valeurs nulles

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 nov. 2007, 16:56

Bizarre d'appeler des champs "texte" avec "id_" c'est juste une question de gout :-k

Le résultat voulu est
Albert
Durand
Dupont
Marcel
Martin
NULL
NULL
Non ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 32 Messages

17 nov. 2007, 16:58

oui c'est cela et j'ai beau essayer tout un tas de requête, j'ai soit les valeurs NULL en premier, soit en dernier mais alors les noms ne sont plus classés par ordre alphabétique

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 nov. 2007, 17:02

La requête de Sékiltoyai te donne quoi ?

Car elle me semble plutôt correcte :-k

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 32 Messages

17 nov. 2007, 17:12

le résultat est identique à une requête avec un order by id_nom tout simple

Eléphant du PHP | 185 Messages

17 nov. 2007, 17:42

Bien, pour le test j'ai créé une table toute simple :

Code : Tout sélectionner

CREATE TABLE `test` ( `id` int(11) NOT NULL auto_increment, `nom` varchar(40) NOT NULL, `info` varchar(40) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; INSERT INTO `test` (`id`, `nom`, `info`) VALUES (1, 'George', 'francais'), (2, 'Marie', 'espagnole'), (3, 'Pierre', 'allemand'), (4, 'Roger', 'italien'), (5, 'Claude', ''), (6, '', 'anglais');
J'ai ensuite testé plusieurs requêtes différentes, sans résultat satisfaisant ! :(

Première, deuxième et troisième requêtes :
$requete = "SELECT nom, info FROM test ORDER BY (nom IS NOT NULL) ASC";
$requete = "SELECT nom, info FROM test ORDER BY nom IS NOT NULL";
$requete = "SELECT nom, info FROM test ORDER BY nom IS NOT NULL ASC";
Retournent :
George | francais
Marie | espagnole
Pierre | allemand
Roger | italien
Claude | NULL
NULL | anglais
Les noms ayant une valeur NULL sont bien affichés en dernier, mais ceux étant NOT NULL ne sont pas triés par ordre alphabétique.

Quatrième, cinquième, sixième et septième requête :
$requete = "SELECT nom, info FROM test ORDER BY nom ASC";
$requete = "SELECT nom, info FROM test ORDER BY (nom IS NULL) ASC, nom ASC";
$requete = "SELECT nom, info FROM test ORDER BY (nom IS NOT NULL) ASC, nom ASC";
$requete = "SELECT nom, info FROM test ORDER BY nom ASC, info";
Retournent :
NULL | anglais
Claude | NULL
George | francais
Marie | espagnole
Pierre | allemand
Roger | italien
Cette fois les noms sont bien triés par ordre alphabétique, mais les noms NULL apparaîssent en haut de tableau.

Huitième requête :
$requete = "SELECT nom, info FROM test ORDER BY (nom IS NOT NULL) ASC, info";
Retourne :
Claude | NULL
Pierre | allemand
NULL | anglais
Marie | espagnole
George | francais
Roger | italien
Avec cette requête l'ordre est d'abord effectué sur le noms NOT NULL, puis retrié à partir des infos, ce qui ne permet toujours pas d'avoir le résultat souhaité.

C'est à en perdre son latin !

Eléphanteau du PHP | 32 Messages

17 nov. 2007, 17:47

oui j'avais essayé tout ça aussi sans résultat

merci de ton aide quand même

je continu à chercher

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 nov. 2007, 18:19

@Kaoteknik ton exemple de table comporte un champ nom mais avec "NOT NULL" donc jamais de vrai valeur NULL... pas sur du résultat d'un "IS NULL" ou "IS NOT NULL" dessus.

Par contre avec la requête de Sékiltoyai j'ai bien les nom triés dans l'ordre alphabétique suivis des NULL en fin.

Code : Tout sélectionner

SELECT id_prenoml FROM tbl_newsletter ORDER BY (id_prenoml IS NULL) ASC, id_prenoml ASC

Code : Tout sélectionner

CREATE TABLE `tbl_newsletter` ( `incr_id` int(11) unsigned NOT NULL auto_increment, `id_prenoml` varchar(80) collate utf8_bin default NULL, PRIMARY KEY (`incr_id`) ); INSERT INTO `tbl_newsletter` (`incr_id`, `id_prenoml`) VALUES (1, 'Marcel'), (2, NULL), (3, 'Albert'), (4, NULL), (5, 'Martin'), (6, 'Dupont'), (7, 'Durand');

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 185 Messages

17 nov. 2007, 18:29

Curieux ça... Je viens de changer la valeur du champs "nom" en NULL, j'ai retesté avec le code proposé par Sékiltoyai, mais le résultat n'a pas changé.

Code : Tout sélectionner

CREATE TABLE `test` ( `id` int(11) NOT NULL auto_increment, `nom` varchar(40) default NULL, `info` varchar(40) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
Et la requête correspondante :
$requete = "SELECT nom, info FROM test ORDER BY (nom IS NULL) ASC, nom ASC";

Eléphanteau du PHP | 32 Messages

17 nov. 2007, 18:48

idem pour moi, je pige pas

ViPHP
ViPHP | 5924 Messages

17 nov. 2007, 19:46

Code : Tout sélectionner

INSERT INTO `test` (`id`, `nom`, `info`) VALUES (1, 'George', 'francais'), (2, 'Marie', 'espagnole'), (3, 'Pierre', 'allemand'), (4, 'Roger', 'italien'), (5, 'Claude', ''), (6, '', 'anglais');
Euh '' et NULL ce n'est pas équivalent. Une chaine vide n'est pas une donnée indéfinie, c'est une chaine vide… Ensuite, tu as créé des champs NOT NULL, il faut tester avec des champs NULL :

Code : Tout sélectionner

CREATE TABLE `test_order` ( `id` int(11) NOT NULL auto_increment, `nom` varchar(40) DEFAULT NULL, `info` varchar(40) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 AUTO_INCREMENT=7;
Si on fait avec tes enregistrements :

Code : Tout sélectionner

mysql> SELECT nom, info, (nom IS NULL) FROM test_order ORDER BY (nom IS NULL) DESC, nom ASC; +--------+-----------+---------------+ | nom | info | (nom IS NULL) | +--------+-----------+---------------+ | | anglais | 0 | | Claude | | 0 | | George | francais | 0 | | Marie | espagnole | 0 | | Pierre | allemand | 0 | | Roger | italien | 0 | +--------+-----------+---------------+ 6 rows in set (0.00 sec)
Si on ajoute ceci :

Code : Tout sélectionner

INSERT INTO `test_order` (`id`, `nom`, `info`) VALUES (7, NULL, 'belge'), (8, NULL, 'breton'); INSERT INTO `test_order` (`id`, `info`) VALUES (9, 'georgien'), (10, 'corse');
On a ceci :

Code : Tout sélectionner

mysql> SELECT nom, info, (nom IS NULL) FROM test_order ORDER BY (nom IS NULL) ASC, nom ASC; +--------+-----------+---------------+ | nom | info | (nom IS NULL) | +--------+-----------+---------------+ | | anglais | 0 | | Claude | | 0 | | George | francais | 0 | | Marie | espagnole | 0 | | Pierre | allemand | 0 | | Roger | italien | 0 | | NULL | belge | 1 | | NULL | breton | 1 | | NULL | georgien | 1 | | NULL | corse | 1 | +--------+-----------+---------------+ 10 rows in set (0.00 sec)
Soit le résultat escompté…

Eléphanteau du PHP | 32 Messages

17 nov. 2007, 20:03

ok pigé, merci bcp

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 nov. 2007, 20:37

Les remarques tout à fait justes de Sékiltoyai ont déjà été faites avant il faut donc lire plus attentivement les messages. :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 185 Messages

17 nov. 2007, 23:01

Ok, ça fonctionne effectivement mieux comme ça ! :)

En fait, si je comprends bien, les enregistrements de chaînes vides n'ont pas été considérées comme NULL dans la mesure où, au moment de leur insertion, je n'avais pas défini le champ "nom" comme NULL par défaut...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 nov. 2007, 23:17

Moui... mais non :lol:

Tu as placé '' dans la requête d'insertion ce qui est différent de NULL.
Il y a donc une valeur insérée.

Le principal est que le champ soit déclaré en tant que NULL la valeur par défaut sera forcément NULL

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 185 Messages

18 nov. 2007, 10:51

D'aucun dirait : "mais quel boulet !" :oops:

Merci pour ces explications, j'y vois plus clair à présent. :wink: