Je ne sais pas s'il existe des méthodes plus soignées, mais cela devrait fonctionner :
SELECT Field1, Field2, ISNULL(Field1) + ISNULL(Field2) Num_Null
FROM YourTable;
Scénario de test :
CREATE TABLE YourTable (Field1 varchar(10), Field2 varchar(10));
INSERT INTO YourTable VALUES (NULL, 'A');
INSERT INTO YourTable VALUES ('B', 'C');
INSERT INTO YourTable VALUES ('B', NULL);
INSERT INTO YourTable VALUES (NULL, NULL);
Résultat :
+--------+--------+----------+
| Field1 | Field2 | Num_Null |
+--------+--------+----------+
| NULL | A | 1 |
| B | C | 0 |
| B | NULL | 1 |
| NULL | NULL | 2 |
+--------+--------+----------+
4 rows in set (0.00 sec)
MISE À JOUR : Suite à la question mise à jour :
Si vous avez des colonnes dans votre tableau qui ressemblent à affiliate_1
, affiliate_2
, etc., c'est rarement une bonne idée car vous mélangeriez des données avec les métadonnées. En général, une solution recommandée consiste à utiliser une autre table dépendante pour les relations utilisateurs-affiliés, comme dans l'exemple suivant :
CREATE TABLE users (
user_id int,
user_name varchar(100),
PRIMARY KEY (user_id)
) ENGINE=INNODB;
CREATE TABLE users_affiliates (
user_id int,
affiliate_name varchar(100),
PRIMARY KEY (user_id, affiliate_name),
FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;
Trier ensuite les users
le tableau par nombre d'affiliés ressemblera à ceci :
SELECT u.*, d_tb.num_aff
FROM users
JOIN (
SELECT user_id, COUNT(*) num_aff
FROM users_affiliates
GROUP BY user_id
) d_tb ON (d_tb.user_id = u.user_id)
ORDER BY d_tb.num_aff DESC;
Les avantages sont nombreux, mais surtout, cela rend les requêtes telles que celles ci-dessus faciles à écrire et suffisamment flexibles pour fonctionner avec n'importe quel nombre d'affiliés (et non limité par le nombre de colonnes que vous avez allouées).