Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Đếm số NULL trong một hàng

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ổ).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. làm thế nào để ngăn chặn việc tiêm sql từ truy vấn này?

  2. Quyền SELECT INTO OUTFILE bị từ chối nhưng người dùng có thể ghi vào thư mục

  3. Chạy nhiều câu lệnh mysql trong một giao dịch trong công cụ di chuyển Mybatis

  4. nối các bảng và hiển thị kết quả [Laravel 5]

  5. Hoạt động của người dùng (ala facebook) Phương pháp tiếp cận DB. THAM GIA lớn hay nhiều truy vấn đơn giản?