2016-08-13 2 views
3

ich eine Indextabelle der Einheit haben Attributwerte, die wie folgt aussieht: +-----------+--------------+----------+-------+ | 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 | +-----------+--------------+----------+-------+ Wie Werte zählen bedingt in SQL

Wie Sie eine einzelne Einheit mehrere Werte für ein einzelnes Attribut haben kann sehen (entity_id 38 hat value s 22,23) und diese Werte sind nicht eindeutig pro Einheit (entity_id 38,39 beide teilen value 22).

Das erste zu lösende Problem besteht darin, die Anzahl der verschiedenen Entitäten pro Wert zu ermitteln. dies leicht erreicht mit:

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

die Ergebnisse in: +-------+-------+ | value | count | +-------+-------+ | 22 | 5 | | 23 | 2 | | 42 | 1 | | 54 | 3 | +-------+-------+

Meine Frage ist, wie kann ich Nest eine ODER-Bedingung in dieser Zählung, nämlich: für einige spezifischen Wert Y, für jeden Wert X, zähle die Anzahl der Entitäten, die entweder den Wert X oder Y haben.

Ich möchte dies in einer einzigen Abfrage tun. Zum Beispiel für attribute_id 190 und value 23, sollte die Ausgabe von oben Beispiel sein: +-------+-------+ | value | count | +-------+-------+ | 22 | 5 | # all entities with value 22 happen to have 23 as well | 23 | 2 | that is, one is a subset of the other | 42 | 2 | # intersection is nonempty | 54 | 5 | # sets are disjoint +-------+-------+

+0

Sie wollen, außer dass die gleiche Abfrage auszuführen nur bestimmte Werte wählen? – Luke

+0

Nein. Betrachten Sie die erste Abfrage, die zu der ersten Tabelle [Wert, Anzahl] führt. Ich möchte eine analoge Abfrage finden, die in der zweiten Tabelle [Wert, Anzahl] oben resultiert. Es werden immer noch alle Werte ausgewählt, aber es zählt die Entity_id mit dem Wert x OR y bedingt, anstatt die Entity_id mit dem Wert x zu zählen. – SamTay

+0

Sie wollen also eine separate Ergebnismenge für jeden der Werte in der ersten Ergebnistabelle? – Luke

Antwort

0

Try

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 
+0

Sorry, aber das ist nicht die richtige Logik. Mit dieser Abfrage bekomme ich ein Paar ['value' => 22, 'count' => 7] zurück. Siehe ursprüngliche Frage, die Abfrage sollte nur eindeutige Entitäten zählen. – SamTay

0

Es gibt Ihnen beiden Ergebnisse in einzelner Abfrage zu verwenden, wenn es Ihre Ausgabe erfüllt ist.

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 
+0

Sieht aus, als gäbe es hier Syntaxfehler, ich kann dieses SQL nicht so ausführen, wie es ist. Meine Version ist: 'Ver 15.1 Verteilen 10.1.16-MariaDB, für Linux (x86_64) mit readline 5.1' – SamTay

+0

Es funktioniert gut in SQL 2012, können Sie bitte die kurze Fehlermeldung – Susang

+0

' FEHLER 1064 (42000) ': Sie haben ein Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MariaDB-Serverversion entspricht, für die richtige Syntax in der Nähe von 'OUTER APPLY (SELECT COUNT (entity_id) tot FROM catalog_product_index_eav' in Zeile 3 – SamTay

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 
+0

Danke, diese Abfrage liefert das gewünschte Ergebnis.Wenn jemand mit einer effizienteren Abfrage I kommen kann wird die angenommene Antwort ändern Danke! – SamTay

+0

Ich habe diese Antwort nicht akzeptiert, weil die Zählung WHERE-Parameter im äußeren nicht berücksichtigt. Dies ist für meinen Anwendungsfall notwendig. – SamTay