【发布时间】:2014-08-08 14:27:02
【问题描述】:
编辑: SQL Fiddle here
我正在处理产品 Feed。我得到一份报价清单;
- 每个优惠都有 1 个产品
- 每个产品都属于一个类别
- 一个类别可以是另一个类别的子类别
我有三个表(我只会向您显示相关行)
优惠:
OFFERS
___________________
| id | product_id |
-------------------
| 1 | 16 |
-------------------
| 2 | 54 |
-------------------
| 3 | 52 |
-------------------
| 4 | 20 |
-------------------
| 5 | 7 |
-------------------
| 6 | 5 |
-------------------
产品:
PRODUCTS
_______________
| id | cat_id |
---------------
| 16 | 1 |
---------------
| 54 | 3 |
---------------
| 52 | 4 |
---------------
| 20 | 1 |
---------------
| 7 | 15 |
---------------
| 5 | 3 |
---------------
分类:
CATEGORIES
_____________________________________________________________
| id | display_name | original_name | subcat_of | is_active |
-------------------------------------------------------------
| 1 | Cars | automobiles | 0 | 1 |
-------------------------------------------------------------
| 2 | | motorcycles | 0 | 0 |
-------------------------------------------------------------
| 3 | Muscle cars | muscle-cars | 1 | 1 |
-------------------------------------------------------------
| 4 | Hybrid cars | treehugwagons | 1 | 1 |
-------------------------------------------------------------
我必须编写两个查询。第一个需要
- 返回名称并计算给定主类别及其子类别的报价数量
- 但前提是该主要类别处于活动状态
- 如果一个类别没有 display_name,则使用 original_name
我想我有这个:
SELECT
offers.id AS offer_id,
product_id,
products.cat_id,
CASE
WHEN categories.display_name <> ''
THEN categories.display_name
ELSE categories.original_name
END AS cat_name,
COUNT(offers.id) as num_offers
FROM
offers
INNER JOIN
products
ON
product_id = products.id
INNER JOIN
categories
ON
cat_id = categories.id
WHERE
categories.is_active = 1
AND
(categories.id = :cat_id OR categories.subcat_of = :cat_id)
GROUP BY
cat_name
ORDER BY
cat_name ASC
我很确定这个查询远非理想,但就目前而言,它有效。
这是我需要的第二个查询给我带来了问题。那个人需要:
- 返回名称并计算给定主要类别及其子类别的报价数量并返回每个主要类别的这些计数的总和
- 但前提是该主要类别处于活动状态
- 如果一个类别没有 display_name,则使用 original_name
我可以使用一些 PHP 自己进行求和,但如果在 SQL 中无法完成这么简单的事情,我会感到惊讶。
【问题讨论】:
-
您是否介意提供您所做的示例:sqlfiddle.com
-
你能发布写第二个查询的尝试吗?如果你有一个起点,人们会更容易帮助你:) 编辑:@ThomasJunk 打败了我!
-
您能否在您的数据库中使用第一个查询创建一个视图并使用
SELECT SUM(sum_offers) FROM your_view GROUP BY cat_name从那里获取第二个视图的总和?希望我理解您的要求,我不确定主要类别是什么(是一个没有子类别的类别,您想要它和所有子类别的总和?)。 -
显然我在写上面的时候喝醉了。我在问:主类是一个不是子类的类吗?您想要主类别及其所有子类别的报价总和?
-
哇,你醒得很快:P确实,这就是我想做的。