ホームページ >データベース >mysql チュートリアル >SQL で異なるテーブルの複数の列を効率的にクエリする方法は?

SQL で異なるテーブルの複数の列を効率的にクエリする方法は?

DDD
DDDオリジナル
2025-01-21 10:51:10508ブラウズ

How to Efficiently Query Multiple Columns from Different Tables in SQL?

複数テーブル、複数列の SQL クエリの最適化

複数のテーブルからデータを取得する場合、特にさまざまな列から値を集計する必要がある場合に問題が発生することがよくあります。最近のサポート ケースでは、ユーザーが 2 つのテーブルの複数の列にわたる値を正確にカウントすることが難しいことが浮き彫りになりました。ネストされたサブクエリを使用した最初の試みでは、誤った結果が得られました。

欠陥のあるクエリは次のようになります:

<code class="language-sql">SELECT * from
    ( SELECT COUNT(DAY_IN) AS arr FROM t_hospital WHERE DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res and ID_daily_hos =@daily_hos group by DAY_IN )e,
    (SELECT COUNT(PAT_STATUS) AS ONG1 FROM t_hospital WHERE PAT_STATUS like '%ong%' and DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res and ID_daily_hos =@daily_hos group by DAY_IN ) a,
    (SELECT COUNT(PAT_STATUS) AS RTED FROM t_hospital WHERE PAT_STATUS like '%rtde%'and DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res and ID_daily_hos =@daily_hos group by DAY_IN )b,
    (SELECT COUNT(PAT_STATUS) AS POLI FROM t_hospital WHERE PAT_STATUS like '%pol%'and DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res and ID_daily_hos =@daily_hos group by DAY_IN )c,
    (SELECT COUNT(PAT_STATUS) AS para FROM t_hospital WHERE PAT_STATUS like '%para%' and DAY_IN between @start_check and @finish_check and RES_DATE between @start_res and @finish_res and ID_daily_hos =@daily_hos group by DAY_IN )d</code>

解決策は、単一のクエリ内で条件付き集計を使用することです。この合理化されたアプローチは、指定された条件に基づいて複数の列を計算し、正確な結果を提供します。 改良されたクエリは次のとおりです:

<code class="language-sql">SELECT DAY_IN, COUNT(*) AS arr,
        SUM(IF(PAT_STATUS like '%ong%', 1, 0)) AS ONG1,
        SUM(IF(PAT_STATUS like '%rtde%', 1, 0)) AS RTED,
        SUM(IF(PAT_STATUS like '%pol%', 1, 0)) AS POL1,
        SUM(IF(PAT_STATUS like '%para%', 1, 0)) AS para
FROM t_hospital 
WHERE DAY_IN between @start_check and @finish_check 
    and RES_DATE between @start_res and @finish_res  
    and ID_daily_hos =@daily_hos
GROUP BY DAY_IN</code>

この改訂されたクエリは、必要なデータを効率的に取得し、元の過度に複雑な構造に関連するエラーを排除します。 重要なのは、条件付き SUM() ステートメントを使用して、計算を単一の適切に構造化されたクエリに統合することです。

以上がSQL で異なるテーブルの複数の列を効率的にクエリする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。