我有像
这样的表格products product_attributes
================== ========================================
| id | name | | id | product_id | attribute | value |
================== ========================================
| 1 | product 1 | | 1 | 1 | min | 2 |
| 2 | product 2 | | 2 | 1 | max | 5 |
| 3 | product 3 | | 3 | 2 | min | 10 |
| 3 | product 3 | | 4 | 2 | max | 15 |
| .. | ... | | 5 | 3 | min | 1 |
================== | 6 | 3 | max | 100 |
| .. | ... | ... | ... |
========================================
我希望获得属于某个范围的所有产品 我可以使用
成功获取与范围一致的ID列表SELECT p.id
FROM `products` p INNER JOIN `product_attributes` AS pa ON p.id = pa.product_id
WHERE pa.`min` <= 5 AND pa.`max` >= 5 GROUP BY p.id
这给了我一个我需要的ID列表。 我无法工作的是获得ID的总计数而不是列表,所以我不能使用该组,然后当我这样做时,它会弄乱计数。
唯一的方法是在子选择中使用上面的选择并计算 结果
由于
答案 0 :(得分:1)
只需在查询中将p.id
替换为COUNT(1)
。
SELECT COUNT(1)
FROM `products` p
INNER JOIN `product_attributes` AS pa
ON p.id = pa.product_id
WHERE pa.`min` <= 5
AND pa.`max` >= 5
GROUP BY p.id
答案 1 :(得分:1)
鉴于上面的结构,min和max在不同的行上,我会用这个:
select count(id) from (
select p.id
from
`products` p INNER JOIN `product_attributes` AS pa
ON p.id = pa.product_id
where (pa.attribute='min' and pa.value>=5) OR
(pa.attribute='max' and pa.value<=5)
group by p.id
having count(*)=2
) s
答案 2 :(得分:0)
一种方法是在尝试从中提取任何信息之前,将规范化的胶合板应用于eav模型。在这种情况下,可能如下所示:
SELECT product_id
, MAX(CASE WHEN attribute = 'min' THEN value END) `min`
, MAX(CASE WHEN attribute = 'max' THEN value END) `max`
FROM product_attributes
GROUP
BY product_id;
+------------+------+------+
| product_id | min | max |
+------------+------+------+
| 1 | 2 | 5 |
| 2 | 10 | 15 |
| 3 | 1 | 100 |
| ... | ... | ... |
+------------+------+------+
现在,你的问题又是什么?
答案 3 :(得分:0)
尝试从select语句中选择计数(*)。