每当您有多对多关系时(例如,一个地区可能包含许多商店;一个商店可能包含许多地区),您将需要在这些实体之间使用交叉引用表。
我假设一个特定的地区可能只被一个国家所包含。以下是我将如何模拟您的方案:
countries(country_id [PK], name, ...)
districts(district_id [PK], country_id [FK], name, ...)
districts_has_stores(district_id [PK], store_id [PK])
stores(store_id [PK], name, ...)
categories_has_stores(category_id [PK], store_id [PK])
categories(category_id [PK], name, ...)
在急诊室:
districts_has_stores
并且categories_has_stores
是表示实体之间多对多关系的交叉引用表。
基于此模型,您可以检索特定国家/地区内的所有商店,并使用以下 SQL 按地区名称对商店进行排序:
SELECT
c.*
FROM
districts a
INNER JOIN
districts_has_stores b ON a.district_id = b.district_id
INNER JOIN
stores c ON b.store_id = c.store_id
WHERE
a.country_id = <country_id here>
ORDER BY
a.name
检索每个国家/地区的商店数量:
SELECT
a.country_id,
COUNT(*) AS store_count
FROM
districts a
INNER JOIN
districts_has_stores b ON a.district_id = b.district_id
GROUP BY
a.country_id
编辑:根据您对此答案的评论,这是一个示例,说明如何检索具有 category_id 的所有商店1
:
SELECT
b.*
FROM
categories_has_stores a
INNER JOIN
stores b ON a.store_id = b.store_id
WHERE
a.category_id = 1
检索特定 category_id( 1
) 中的所有商店并过滤结果以仅包括位于 Districts4
或5
中的那些商店。
SELECT DISTINCT
b.*
FROM
categories_has_stores a
INNER JOIN
stores b ON a.store_id = b.store_id
INNER JOIN
districts_has_stores c ON b.store_id = c.store_id
WHERE
a.store_id = 1 AND
c.district_id IN (4,5)