Mailinglisten-Archive |
Michael Renner schrieb am Donnerstag, den 15. Juli 1999: > Zeige alle Eintr"age aus IDs, bei denen IDv = 1 ist, > aber nur, wenn es dazu auch eine Zeile gibt, in der f"ur > das selbe IDs ein IDv = 29 ist u.s.w. > Oder im Beispiel: > IDs | IDv | > +------+------+ > | 1 | 2 | > | 2 | 1 | > | 3 | 1 | > | 3 | 29 | > | 5 | 29 | > | 8 | 1 | > Wenn ich nach IDv = 1 und IDv = 29 suche muss als > Ergebnis die 3 kommen! Da hilft ein Kreuzprodukt der Tabelle mit sich selbst (SELF JOIN): SELECT t1.IDs FROM s_link_v AS t1, s_link_v AS t2 WHERE t1.IDs = t2.IDs AND t1.IDv = 1 AND t2.IDv = 29 ; Nur so als Gedankenspielerei ein anderer Ansatz, bei dem (ohne Kreuzprodukt) über IDs gruppiert wird. Um herauszufinden, ob innerhalb eine Gruppe die gesuchten zwei IDv-Werte vorhanden sind, kann man diese beiden auf 1 abbilden, alle anderen auf 0 - und wenn die Summe über die Gruppe 2 ergibt, dann waren beide Werte dabei: SELECT IDs FROM s_link_v GROUP BY IDs HAVING SUM( SIGN(FIELD(IDv,1,29)) ) = 2 ; Kurzerklärung: - FIELD liefert 0, falls nicht in der Liste, sonst die Position des Suchelemets in der Liste - SIGN bildet positive Zahlen auf 1 ab, die Null bleibt 0. Für eine Bedingung "genau 3 aus 4" wäre es z.B. FIELD(IDv,w,x,y,z) ... = 3, oder "mindestens 2 aus 4": FIELD(IDv,w,x,y,z) ... >= 2. Ähnlich könnte man mit Hilfe von Bitverknüpfungen auch leicht Kombinationen abfragen: SELECT IDs ,BIT_OR( POWER(2, FIELD(IDv,1,2,29)) ) >> 1 AS X FROM s_link_v GROUP BY IDs HAVING X IN (3,5); --> die IDv-Kombinationen (1 und 2) und (1 und 29). (Theoretisch könnte man auch ohne das Alias X arbeiten und den BIT_OR-Term direkt hinter HAVING schreiben, aber zumindest bei MySQL V3.22.19b funktioniert dann IN (...) nicht richtig - ein Bug.) Und wer sich mit der Bit-Arithmetik nicht so recht anfreunden will, kann diese Kombinationen auch mit "sichtbaren" Bits hinschreiben: SELECT IDs ,CONV( BIT_OR( POWER(2, FIELD(IDv,1,2,29)) ) >> 1 ,10,2) AS X FROM s_link_v GROUP BY IDs HAVING X IN (011,101); Wie gut oder schlecht bei solchen Rumrechnereien dann allerdings die Geschwindigkeit der Abfragen, insbesondere bei großen Tabellen, sein wird, weiß ich nicht. Halt mal testen ... > BTW: Wenn schon so sch"on "uber den Plural/Singular > gesprochen wird: Was ist der korrekte(!) Plural > von Skript? Ich würde sagen: "Skripte". Allerdings ist "Skript" selbst eigentlich eine Kurzform von "Skriptum" und dessen Pluralformen sind sowohl "Skripten" als auch "Skripta". Ciao, Martin -- Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://home.pages.de/~ramsch/ > PGP KeyID=0xE8EF4F75 FiPr=52 44 5E F3 B0 B1 38 26 E4 EC 80 58 7B 31 3A D7 --- *** Abmelden von dieser Mailingliste funktioniert per E-Mail *** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe
php::bar PHP Wiki - Listenarchive