我正在开发一个由产品和类别组成的电子商务商店。我有3种过滤产品的主要方式:按类别,按制造商和按性别分类。
我有以下表格
products
- id
- name
- manufacturer_id
- gender_id
categories
- id
- name
- parent_id
products2categories
- id
- product_id
- category_id
manufacturers
- id
- name
gender
- id
- name
使用这些表我可以列出产品,例如找到所有manufacturer_id = 1, gender = 1, category= 453
。
但是,我希望能够控制为每个滤镜组合设置图像,页面标题,元标记,显示顺序等。所以我添加了另一张表:
pages
- id
- category_id
- manufacturer_id
- gender_id
- image
- page_title
- meta_description
- display_order
这有效,但我现在的任务是确保每个可能的组合都在此表中。例如,在添加新产品时,我需要创建所有组合。此外,如果我想在未来添加更多过滤器,表格将变得越来越大。我可以使用另一种方法,或者这是唯一的方法吗?
答案 0 :(得分:1)
如果没有完全匹配,您可以使用“默认”或“后备”记录,如下所示:
SELECT p.*, g.*
FROM products p
JOIN product2categories pс
ON pc.product_id = p.id
LEFT JOIN
pages gcgm
ON gcgm.category_id = pc.category_id
AND gcgm.gender_id = p.gender_id
AND gcgm.manufacturer_id = p.manufacturer_id
LEFT JOIN
pages gcg
ON gcg.category_id = pc.category_id
AND gcg.gender_id = p.gender_id
AND gcg.manufacturer_id IS NULL
AND gcgm.id IS NULL
LEFT JOIN
pages gc
ON gc.category_id = pc.category_id
AND gc.gender_id IS NULL
AND gc.manufacturer_id IS NULL
AND gcg.id IS NULL
JOIN pages g
ON g.id = COLAESCE(gcgm.id, gcg.id, gc.id)
WHERE pc.category_id = 453
AND p.manufacturer_id = 1
AND p.gender = 1
这将首先尝试选择(gender, manufacturer, collection)
的完整组合,如果没有这样做,将首先回到(collection, gender)
然后再回到(collection)
。