我有一个实体属性值的索引表,如下所示:
+-----------+--------------+----------+-------+
| 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
答案 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