sql >> データベース >  >> RDS >> Mysql

行のNULLの数を数える

    きちんとした方法があるかどうかはわかりませんが、これでうまくいくはずです:

    SELECT Field1, Field2, ISNULL(Field1) + ISNULL(Field2) Num_Null
    FROM   YourTable;
    

    テストケース:

    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);
    

    結果:

    +--------+--------+----------+
    | Field1 | Field2 | Num_Null |
    +--------+--------+----------+
    | NULL   | A      |        1 |
    | B      | C      |        0 |
    | B      | NULL   |        1 |
    | NULL   | NULL   |        2 |
    +--------+--------+----------+
    4 rows in set (0.00 sec)
    

    更新: 更新された質問に加えて:

    テーブルにaffiliate_1のような列がある場合 、affiliate_2 、など、データとメタデータを混合するため、これが適切なアイデアになることはめったにありません。一般に、推奨される修正は、次の例のように、ユーザーとアフィリエイトの関係に別の依存テーブルを使用することです。

    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;
    

    次に、usersを並べ替えます アフィリエイト数別の表は次のようになります:

    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;
    

    利点はたくさんありますが、最も重要なのは、上記のようなクエリを簡単に記述でき、任意の数のアフィリエイト(割り当てた列の数に制限されない)と連携するのに十分な柔軟性があることです。



    1. MySQLはAUTO_INCREMENT値をMAX(id)+ 1ショートカットに設定しましたか?

    2. 今週の注文テーブルからレコードをプルします

    3. HQLはexecuteUpdateで不完全な「クロスジョイン」を生成しています

    4. MySQLのmy.cnfの場所を見つけるにはどうすればよいですか