sql >> Database >  >> RDS >> Mysql

selecteer zoekopdracht en tel op basis van voorwaarde

Ik zie geen reden waarom je een subquery zou moeten gebruiken. Ik geloof dat je gewoon fi_business . kunt combineren en fi_business_subcategory naar een tabelfactor tussen haakjes.

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

Ik heb aangevinkt dat dit een geldige SQL is voor uw tabelstructuur. Ik denk dat de kans groot is dat het het gewenste resultaat oplevert, ook al bevat je viool nog geen gegevens. Zie de handleiding over de JOIN-syntaxis voor details over waar je haakjes in een join kunt gebruiken.

Je kunt je ook afvragen of je echt alle joins nodig hebt om links te blijven. Dingen schrijven met behulp van inner joins zou veel gemakkelijker zijn.

Aangezien joins van links naar rechts worden uitgevoerd, kunt u eerst de inner joins doen, gevolgd door een reeks rechts doet mee. Dit vermijdt de haakjes:

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. Een nieuwe VM voorbereiden voor SQL Server 2014 CTP1

  2. MySQL ODBC-verbindingen sluiten/poolen

  3. sla kopiëren naar tmp-tabel op schijf over mysql

  4. alleen mysqldump-schema, schema-update zonder drop