sql >> Databasteknik >  >> RDS >> Mysql

välj fråga och räkna baserat på skick

Jag ser ingen anledning till varför du ska behöva använda en underfråga. Jag tror att du helt enkelt kan kombinera fi_business och fi_business_subcategory till en enda tabellfaktor 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

Jag har kontrollerat att detta är giltig SQL för din tabellstruktur. Jag antar att chanserna är goda att det kommer att ge önskat resultat, även om din fiol inte innehåller några data ännu. Se manualen om JOIN-syntax för detaljer om var du kan använda parenteser i en join.

Du kan också fråga dig själv om du verkligen behöver alla joins för att bli kvar joins. Att skriva saker med inre sammanfogningar skulle vara mycket lättare.

Eftersom kopplingar körs från vänster till höger kan du göra de inre kopplingarna först, följt av en sekvens med höger ansluter sig. Detta undviker parenteserna:

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. Ta aldrig bort poster? Bra idé? Vanliga?

  2. Mysql välj var inte i tabellen

  3. Resultat från e-postfrågor som en HTML-tabell i SQL Server (T-SQL)

  4. Hur man uppdaterar en MySQL-kolumn baserat på en kryssruteinmatning