sql >> Base de Datos >  >> RDS >> Mysql

seleccionar consulta y contar según la condición

No veo ninguna razón por la que debas usar una subconsulta. Creo que simplemente puedes combinar fi_business y fi_business_subcategory a un solo factor de tabla entre paréntesis.

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

He verificado que este es un SQL válido para la estructura de su tabla. Supongo que hay muchas posibilidades de que produzca el resultado deseado, aunque su violín aún no contenga ningún dato. Consulte el manual sobre la sintaxis de JOIN para obtener detalles sobre dónde puede usar paréntesis en una unión.

También puede preguntarse si realmente necesita que todas las uniones sean uniones dejadas. Escribir cosas usando uniones internas sería mucho más fácil.

Como las uniones se ejecutan de izquierda a derecha, puede hacer las uniones internas primero, seguidas de una secuencia de derecha Uniones. Esto evita los paréntesis:

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