Le résultat voulu est
Non ?Albert
Durand
Dupont
Marcel
Martin
NULL
NULL
Non ?Albert
Durand
Dupont
Marcel
Martin
NULL
NULL
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');
$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 :
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.George | francais
Marie | espagnole
Pierre | allemand
Roger | italien
Claude | NULL
NULL | anglais
$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 :Cette fois les noms sont bien triés par ordre alphabétique, mais les noms NULL apparaîssent en haut de tableau.NULL | anglais
Claude | NULL
George | francais
Marie | espagnole
Pierre | allemand
Roger | italien
$requete = "SELECT nom, info FROM test ORDER BY (nom IS NOT NULL) ASC, info";
Retourne :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é.Claude | NULL
Pierre | allemand
NULL | anglais
Marie | espagnole
George | francais
Roger | italien
Code : Tout sélectionner
SELECT id_prenoml FROM tbl_newsletter ORDER BY (id_prenoml IS NULL) ASC, id_prenoml ASCCode : 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');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 ;$requete = "SELECT nom, info FROM test ORDER BY (nom IS NULL) ASC, nom ASC";
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
INSERT INTO `test` (`id`, `nom`, `info`) VALUES (1, 'George', 'francais'), (2, 'Marie', 'espagnole'), (3, 'Pierre', 'allemand'), (4, 'Roger', 'italien'), (5, 'Claude', ''), (6, '', 'anglais');
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;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)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');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)