Tôi không chắc liệu có phương pháp nào gọn gàng hơn hay không, nhưng cách này sẽ hoạt động:
SELECT Field1, Field2, ISNULL(Field1) + ISNULL(Field2) Num_Null
FROM YourTable;
Trường hợp thử nghiệm:
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);
Kết quả:
+--------+--------+----------+
| Field1 | Field2 | Num_Null |
+--------+--------+----------+
| NULL | A | 1 |
| B | C | 0 |
| B | NULL | 1 |
| NULL | NULL | 2 |
+--------+--------+----------+
4 rows in set (0.00 sec)
CẬP NHẬT: Thêm vào câu hỏi được cập nhật:
Nếu bạn có các cột trong bảng của mình giống như affiliate_1
, affiliate_2
, v.v., đây hiếm khi là một ý tưởng hay vì bạn sẽ trộn dữ liệu với siêu dữ liệu. Nói chung, cách khắc phục được đề xuất là sử dụng một bảng phụ thuộc khác cho mối quan hệ giữa người dùng với các đơn vị liên kết, như trong ví dụ sau:
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;
Sau đó, sắp xếp users
bảng theo số lượng chi nhánh sẽ trông giống như sau:
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;
Ưu điểm là rất nhiều, nhưng quan trọng nhất là nó làm cho các truy vấn như ở trên dễ viết và đủ linh hoạt để làm việc với bất kỳ số lượng chi nhánh nào (không bị giới hạn bởi số cột bạn đã phân bổ).