sql >> Database teknologi >  >> RDS >> Mysql

vælg forespørgsel og optælling baseret på tilstand

Jeg ser ingen grund til, at du skal bruge en underforespørgsel. Jeg tror, ​​at du ganske enkelt kan kombinere fi_business og fi_business_subcategory til en enkelt tabelfaktor i parentes.

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

Jeg har tjekket at dette er gyldig SQL for din tabelstruktur. Jeg gætter på, at chancerne er gode for, at det vil give det ønskede resultat, selvom din violin ikke indeholder nogen data endnu. Se manualen om JOIN-syntaks for detaljer om, hvor du kan bruge parenteser i en joinforbindelse.

Du kan også spørge dig selv, om du virkelig har brug for, at alle sammenføjningerne bliver tilbage. At skrive ting ved hjælp af indre sammenføjninger ville være meget nemmere.

Da joins udføres fra venstre mod højre, kan du måske lave de indre joins først, efterfulgt af en sekvens med højre slutter sig til. Dette undgår parenteserne:

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. Sådan laver du en INSERT Pass-Through-forespørgsel i SQL Server

  2. Brug af RegEx i SQL Server

  3. Find Weblogic Server Version/Patches i EBS R12.2/ Standalone Weblogic

  4. Postgresql ændre kolonnetype fra int til UUID