No estoy seguro de si hay métodos más ordenados, pero esto debería funcionar:
SELECT Field1, Field2, ISNULL(Field1) + ISNULL(Field2) Num_Null
FROM YourTable;
Caso de prueba:
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);
Resultado:
+--------+--------+----------+
| Field1 | Field2 | Num_Null |
+--------+--------+----------+
| NULL | A | 1 |
| B | C | 0 |
| B | NULL | 1 |
| NULL | NULL | 2 |
+--------+--------+----------+
4 rows in set (0.00 sec)
ACTUALIZACIÓN: Además de la pregunta actualizada:
Si tiene columnas en su tabla que se parecen a affiliate_1
, affiliate_2
, etc., rara vez es una buena idea, ya que estaría mezclando datos con metadatos. En general, una solución recomendada es usar otra tabla dependiente para las relaciones entre usuarios y afiliados, como en el siguiente ejemplo:
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;
Luego ordenar los users
la tabla por el número de afiliados se verá así:
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;
Las ventajas son muchas, pero lo más importante es que hace que las consultas como las anteriores sean fáciles de escribir y lo suficientemente flexibles para trabajar con cualquier cantidad de afiliados (y no están limitadas por la cantidad de columnas que asignó).