如何在SQL中有条件地计算值

时间:2016-08-13 02:48:21

标签: mysql sql magento count group-by

我有一个实体属性值的索引表,如下所示: +-----------+--------------+----------+-------+ | entity_id | attribute_id | store_id | value | +-----------+--------------+----------+-------+ | 38 | 190 | 1 | 22 | | 38 | 190 | 1 | 23 | | 39 | 190 | 1 | 22 | | 39 | 190 | 1 | 23 | | 39 | 190 | 1 | 42 | | 40 | 190 | 1 | 22 | | 41 | 190 | 1 | 54 | | 42 | 190 | 1 | 54 | | 43 | 190 | 1 | 22 | | 44 | 190 | 1 | 22 | | 45 | 190 | 1 | 54 | +-----------+--------------+----------+-------+

如您所见,单个实体可以为单个属性设置多个值(entity_id 38具有value s 22,23)并且这些值对于每个实体都不是唯一的({{1} } 38,39共享entity_id 22)。

要解决的第一个问题是获取每个值的不同实体的数量;这很容易实现:

value

导致: SELECT value, COUNT(entity_id) AS count FROM catalog_product_index_eav WHERE attribute_id=190 GROUP BY value;

我的问题是如何在此计数中嵌入OR条件,即:对于某些特定值Y,对于每个值X,计算具有值X或Y的实体数。

我想在一个查询中执行此操作。例如,对于 +-------+-------+ | value | count | +-------+-------+ | 22 | 5 | | 23 | 2 | | 42 | 1 | | 54 | 3 | +-------+-------+ 190和attribute_id 23,上例中的输出应为: value

3 个答案:

答案 0 :(得分:1)

select c1.value, 
( SELECT COUNT(DISTINCT entity_id) as count 
  FROM catalog_product_index_eav 
  where attribute_id=81 
  and (value=c1.value || value=7) ) as count 
FROM catalog_product_index_eav c1 
WHERE attribute_id=81 
GROUP BY c1.value

答案 1 :(得分:0)

尝试使用

Select C.value, max(C.count) from (
SELECT A.value, (Select COUNT(B.entity_id) from FROM catalog_product_index_eav B
WHERE B.attribute_id=A.attribute_id and (B.value=A.value or B.value=23)) AS count
FROM catalog_product_index_eav A
WHERE A.attribute_id=190) C group by C.value

答案 2 :(得分:0)

如果满足您的输出,它会在单个查询中为您提供两个结果。

SELECT i.value AS [value], COUNT(i.entity_id) AS [count], 
(SELECT COUNT(b.entity_id) tot FROM catalog_product_index_eav b
        WHERE b.entity_id IN (SELECT v.entity_id FROM 
        catalog_product_index_eav v WHERE v.VALUE = i.value)) AS [total_count]
FROM catalog_product_index_eav i
WHERE i.attribute_id=190
GROUP BY i.value