teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

790閲覧

MySQLでのデータ取得(count)

t_t_study

総合スコア1

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2022/08/31 10:37

編集2022/08/31 10:40

0

1

前提

MySQLにおいてcount関数を用いたデータの取得を行いたいのですが、行いたいことは実現できるものの、
もっとスマートなSQL文が書けるのではないかと思い質問させていただきます。

「testテーブル」

idstatusdeleted_at
12日付
21null
33日付

上記のテーブルにおいて、「statusには1か2か3」「deleted_atにはnullか日付」が入っているレコードが100件あると想定させていただきます。

実現したいこと

上記のテーブルにおいて、「status = 2の数」「deleted_at = nullの数」「status = 2とdeleted_at = nullの合計」「全レコード数から、status = 2 かつ deleted_at = nullの数を引いた数」の計4つのcountを1回で行いたいです。

下記のsql文を改善したいのですが、方法が思い付かないのでご助力いただきたいです。

該当のソースコード

select count(status = 2 or null) as 'status_count', count(deleted_at is null) as 'deleted_count', (count(status = 2 or null) + count(deleted_at is null)) as '合計', (count(id) - count(case when status = 2 and deleted_at is null then 1 end)) as '引いた数' from test;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/08/31 11:36

> 下記のsql文を改善したいのですが 具体的に、どのような問題があるとお考えですか?
yambejp

2022/09/01 02:39 編集

日付カラムはnullを許諾させないようにしてください たとえばdefaultを9999-12-31など極端な未来日にして、 比較演算子で判定するとよいでしょう
t_t_study

2022/09/01 09:10 編集

maisumakunさん 「count(deleted_at is null))」「count(deleted_at is null))」を2回使用しているので、1回だけの取得で済ませる方法があるのではないかと思いました。 その他、単純に非効率な書き方をしているようでしたらご指摘いただければと思い、質問させていただきました。 言葉足らずで申し訳ありません。
t_t_study

2022/09/01 08:58

yambe.jpさん ありがとうございます。 > 日付カラムにnullを許諾させないようにしてください こちらに関して、理由を調べて勉強させていただきます。
guest

回答1

0

ベストアンサー

計算が全体より大きくなるので「status = 2とdeleted_at = nullの合計」は「status = 2 または deleted_at = null の数」としています。

SQL

1select 2 sum((status = 2)) as status_count 3, sum((deleted_at is null)) as deleted_count 4, sum((status = 2 or deleted_at is null)) as 合計 5, count(id) - sum((status = 2 or deleted_at is null)) as 引いた数 6from test

投稿2022/08/31 12:04

編集2022/08/31 12:06
sazi

総合スコア25430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_t_study

2022/09/02 11:54

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問