order by et valeurs nulles

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : order by et valeurs nulles

par pierre » 18 nov. 2007, 11:51

pour moi le problème venait aussi du fait que j'insérais dans la table une valeur "" (vide) et non une valeur NULL

merci encore pour les explications

par Kaoteknik » 18 nov. 2007, 10:51

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

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

par Truc » 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

par Kaoteknik » 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...

par Truc » 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:

par pierre » 17 nov. 2007, 20:03

ok pigé, merci bcp

par Sékiltoyai » 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é…

par pierre » 17 nov. 2007, 18:48

idem pour moi, je pige pas

par Kaoteknik » 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";

par Truc » 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');

par pierre » 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

par Kaoteknik » 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 !

par pierre » 17 nov. 2007, 17:12

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

par Truc » 17 nov. 2007, 17:02

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

Car elle me semble plutôt correcte :-k

par pierre » 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