2016-05-13 6 views
0

Ich habe Ergebnisse:MYSQL Filter mehrfach Reihe von zwei Listen von id

item_id  subitem_id 
---------------------- 
1   35 
1   25 
1   8 
2   10 
2   25 
3   60 
4   35 
4   25 
4   44 
5   1 
5   23 
5   15 
5   13 
5   9 

und ich habe zwei Listen von subitem

(25,44,1) 
(8,9) 

wie stelle ich die where-Klausel, um das Ergebnis zu filtern und senden Sie dieses

item_id  subitem_id 
---------------------- 
1   35 
1   25 <-- first set 
1   8 <-- second set 
----------------- 
5   1 <-- first set 
5   23 
5   15 
5   13 
5   9 <-- second set 

weil diese item_id sowohl subitem_id von zwei enthalten

listet
SELECT 
    `item_id` 
FROM table 
WHERE `subitem_id` in (25,44,1) 
AND `subitem_id` in (8,9) 

Hat nicht funktioniert, weil in einer Zeit subitem_id haben eine ID (nicht alle Liste)

P. S. Dies ist ein einfaches Beispiel, in Wirklichkeit, die wir mit etwas mehr als 100k Datensätze beitreten Bau

+0

Haben Sie versucht, WHERE subitem_id in (25,44,1) OR subitem_id in (8,9) '? – kyeiti

+0

Können Sie die Logik erklären? Warum gibt 'item_id = 1' die gleiche 3 Zeile als Original zurück, aber' item_id = 5' gibt 5 von 6 zurück? –

+0

@Juan Carlos Oropeza, tut mir leid, das ist Mistacke von Kopie einfügen – Gelid

Antwort

0

SQL Fiddle

Ich glaube, Sie versuchen, eine ITEM_ID um sicherzustellen, dass Unterkategorien in 2 differen-Sets zur Verfügung steht ..

Select * from table A 
where exists (Select 1 from table B where A.Item_Id = B.Item_ID and subitem_ID in (25,44,1)) 
    and exists (Select 1 from table C where A.Item_Id = C.Item_ID and subitem_ID in (8,9)) 
+0

ja. Ich versuche zu überprüfen, welche Artikel-ID hat beide Unterpunkte Form 2 Kategorie. aber was war schneller Unterabfrage wie @Juan Carlos Oropeza oder Ihre Variante? – Gelid

+0

Zu schwer zu sagen Indizes, Datengröße alle spielen eine Rolle bei der Leistung. Du müsstest beides testen und herausfinden. Ich weiß, dass Existenzen den Index verwenden können und aufhören zu schauen, sobald ein einzelnes Vorkommen gefunden wird. – xQbert

+1

Gelid Da @Alex sagte, dass mein Ansatz falsch war (* sehr falsch *). –

1

http://sqlfiddle.com/#!9/71c28e5/3

SELECT t1.* 
FROM (
SELECT DISTINCT(t1.item_id) 
FROM t1 
INNER JOIN t1 t2 
ON t1.item_id = t2.item_id 
    AND t2.subitem_id in (8,9) 
WHERE t1.subitem_id in (25,44,1) 
) t 
LEFT JOIN t1 
ON t.item_id = t1.item_id 

Ein anderer Ansatz große Anzahl der ausgeführten Aufzeichnungen zu vermeiden, mysql:

http://sqlfiddle.com/#!9/71c28e5/10

SELECT t1.* 
FROM t1 
WHERE item_id in (
SELECT DISTINCT(t1.item_id) 
FROM t1 
INNER JOIN t1 t2 
ON t1.item_id = t2.item_id 
    AND t2.subitem_id in (25,44,1) 
WHERE t1.subitem_id in (8,9) 
) 
+0

thx, arbeiten perfekt, im Test auf echte Daten Ende verwenden Sie einige eine – Gelid

+0

2. ist eine viel bessere Leistung weise nach, aber scheint immer noch auf Augenhöhe mit http://sqlfiddle.com/# ! 9/feaba/2/0 Ich habe einen Haufen mehr Daten hinzugefügt. – xQbert

+0

?nach der Geige vorausgesetzt, meine beiden Abfragen dauerte 2 ms vs 189 ms von mir nicht eins? Wie nennt man bessere Leistung? – Alex