Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abfrage auswählen und nach Bedingung zählen

Ich sehe keinen Grund, warum Sie eine Unterabfrage verwenden sollten. Ich glaube, dass man fi_business einfach kombinieren kann und fi_business_subcategory zu einem einzelnen eingeklammerten Tabellenfaktor.

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

Ich habe überprüft dass dies gültiges SQL für Ihre Tabellenstruktur ist. Ich denke, die Chancen stehen gut, dass es das gewünschte Ergebnis liefert, obwohl Ihre Geige noch keine Daten enthält. Siehe das Handbuch zur JOIN-Syntax für Einzelheiten darüber, wo Sie Klammern in einem Join verwenden können.

Sie fragen sich vielleicht auch, ob wirklich alle Joins Left-Joins sein müssen. Das Schreiben von Dingen mit inneren Verknüpfungen wäre viel einfacher.

Da Joins von links nach rechts ausgeführt werden, können Sie zuerst die inneren Joins ausführen, gefolgt von einer Folge von rechts schließt sich an. Dies vermeidet die Klammern:

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