Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

selecione a consulta e conte com base na condição


Não vejo razão para você ter que usar uma subconsulta. Acredito que você pode simplesmente combinar fi_business e fi_business_subcategory para um único fator de tabela entre parênteses.
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

Eu verifiquei que este é um SQL válido para sua estrutura de tabela. Eu acho que as chances são boas de que ele produza o resultado desejado, mesmo que seu violino ainda não contenha nenhum dado. Consulte o manual sobre a sintaxe JOIN para obter detalhes sobre onde você pode usar parênteses em uma junção.

Você também pode se perguntar se realmente precisa que todas as junções sejam junções à esquerda. Escrever coisas usando associações internas seria muito mais fácil.

Como as junções são executadas da esquerda para a direita, você pode fazer as junções internas primeiro, seguidas por uma sequência de direita junta. Isso evita os parênteses:
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