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

クエリを選択し、条件に基づいてカウントします

    サブクエリを使用する必要がある理由はわかりません。 fi_businessを簡単に組み合わせることができると思います およびfi_business_subcategory 単一の括弧で囲まれたテーブルファクターに。

    SELECT
        c.id, 
        c.name,
        c.slug,
        sc.id,
        sc.name,
        sc.slug,
        COUNT(bsc.id) AS business_count
    FROM
        fi_category c
    LEFT JOIN
        fi_subcategory sc ON c.id = sc.category_id AND (sc.deleted_at IS NULL)
    LEFT JOIN (
            fi_business b
        INNER JOIN
            fi_business_subcategory bsc ON b.id = bsc.business_id AND (bsc.deleted_at IS NULL)
        INNER JOIN
            fi_suburb su ON su.id = b.suburb_id AND su.city_id = 1
        ) ON sc.id = bsc.subcategory_id
    WHERE 
        (c.deleted_at IS NULL) 
    GROUP BY 
        c.id, sc.id
    

    チェック済み これがテーブル構造に有効なSQLであること。フィドルにまだデータが含まれていなくても、目的の結果が得られる可能性は高いと思います。 JOIN構文のマニュアル を参照してください。 結合で括弧を使用できる場所の詳細については、

    また、すべての結合を左結合にする必要があるかどうかを自問することもできます。内部結合を使用して物事を書くのははるかに簡単です。

    結合は左から右に実行されるため、最初に内部結合を実行し、次にのシーケンスを実行する場合があります。 参加します。これにより、括弧が回避されます:

    SELECT
        c.id cat_id,
        c.name cat_name,
        c.slug cat_slug,
        sc.id sub_id,
        sc.name sub_name,
        sc.slug sub_slug,
        COUNT(bsc.id) AS business_count
    FROM
        fi_business b
    INNER JOIN
        fi_business_subcategory bsc ON b.id = bsc.business_id
        AND (b.deleted_at IS NULL) AND (bsc.deleted_at IS NULL)
    INNER JOIN
        fi_suburb su ON su.id = b.suburb_id AND su.city_id = 1
    RIGHT JOIN
        fi_subcategory sc ON sc.id = bsc.subcategory_id
    RIGHT JOIN
        fi_category c ON c.id = sc.category_id AND (sc.deleted_at IS NULL)
    WHERE
        (c.deleted_at IS NULL)
    GROUP BY
        c.id, sc.id
    


    1. MYSQL-各年の行を取得し、各月の合計を取得します

    2. SQLiteでRandomBlob()がどのように機能するか

    3. mysqlがデフォルトのポートで実行されていないことをnode.jsに伝える方法は?

    4. 列データが重複している場合、mysqlは行を2回カウントしません