phpbar.de logo

Mailinglisten-Archive

Re: SELECT mit Mehrfachauswahl?
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: SELECT mit Mehrfachauswahl?



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


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive