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