Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 28

Thema: verzwicktes Select

  1. #1
    Registrierter Benutzer
    Registriert seit
    09.04.2002
    Beiträge
    11

    Thumbs up verzwicktes Select

    Hallo Experten!

    Ich habe ein Problem bei der Formulierung eines selcet Statements:

    Tabelle:
    ID | sportart
    -------------------------------
    1 | schwimmen
    1 | fussball
    1 | basketball
    2 | fussball
    2 | basketball
    3 | basketball
    4 | reiten

    Wie bekomme ich aus dieser Tabelle die IDs, wenn ich wissen möchte wer beispielsweise fussball UND basketball spielt? In diesem Fall wäre das Ergebnis 1 und 2.

    Die oder Abfrage ist kein Problem. Ich benutze select from TAB where sportart in(...). Wie mach ich das mit der UND-Verknüpfung?

    Ganz herzlichen Dank für Eure Hilfe!

    Gruß
    boxa

  2. #2
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    sollte zb. so gehen:
    Code:
    select distinct id from tab t1
      where exists (select null from tab where sportart='fussball' and id=t1.id)
        and exists (select null from tab where sportart='basketball' and id=t1.id);
    religion is a virus from outer space

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.04.2002
    Beiträge
    11
    Danke für die sehr schnelle Antwort. Auf meinem Webserver ist MySQL in der Version 4.0.21 installiert. So wie es aussieht gibt es in dieser Version noch keine Subselects. Gibt es eine andere Möglichkeit die Abfrage zu realsisieren?

  4. #4
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Ungetestet:
    Code:
    SELECT T1.`ID`
    FROM `table` AS T1
    JOIN `table` AS T2 ON T1.`ID`=T2.`ID`
    WHERE T1.`sportart`='fussball' AND T2.`sportart`='basketball'

  5. #5
    Registrierter Benutzer
    Registriert seit
    09.04.2002
    Beiträge
    11
    DANKESCHÖN! Es funktioniert!

  6. #6
    Registrierter Benutzer
    Registriert seit
    15.10.2005
    Ort
    Franken
    Beiträge
    362
    Das hier ist performanter, insbesondere wenn du mal nach mehr als 2 Sportarten suchst, sparst du dir damit die unzähligen Joins.

    Code:
    SELECT DISTINCT id 
    FROM table
    WHERE sportart = "basketball" OR sportart = "fussball"
    GROUP BY id
    HAVING COUNT(id) >= 2;
    Dank der Rekursion kann ich IF-Schleifen bauen.

    In neuem Glanz: www.turbohummel.de

  7. #7
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von boxa
    Hallo Experten!

    Ich habe ein Problem bei der Formulierung eines selcet Statements:

    Tabelle:
    ID | sportart
    -------------------------------
    1 | schwimmen
    1 | fussball
    1 | basketball
    2 | fussball
    2 | basketball
    3 | basketball
    4 | reiten

    Gruß
    boxa

    Wenn wir wieder Rechtschreibreform haben und fussball plötzlich
    Fußsball geschrieben wird, mußt du alle Datensätze mit fussball ändern.
    Ist das richtig?
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  8. #8
    Registrierter Benutzer
    Registriert seit
    27.12.2002
    Ort
    Matrix
    Beiträge
    194
    Zitat Zitat von Turbohummel
    Das hier ist performanter, insbesondere wenn du mal nach mehr als 2 Sportarten suchst, sparst du dir damit die unzähligen Joins.

    Code:
    SELECT DISTINCT id 
    FROM table
    WHERE sportart = "basketball" OR sportart = "fussball"
    GROUP BY id
    HAVING COUNT(id) >= 2;
    setzt vorraus, dass keine kombination von id und sportart doppelt vorkommt.

    -j

  9. #9
    Registrierter Benutzer
    Registriert seit
    15.10.2005
    Ort
    Franken
    Beiträge
    362
    Ok, vernünftiges Tabellendesign vorrausgeesetzt. Aber davon bin ich mal ausgegangen.
    Dank der Rekursion kann ich IF-Schleifen bauen.

    In neuem Glanz: www.turbohummel.de

  10. #10
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    Code:
    SELECT id 
    FROM table
    WHERE sportart in ( "basketball", "fussball" )
    GROUP BY id
    HAVING COUNT(1) > 1;
    distinct ist überflüssig, da group by.
    mit "in" kann man den select einfacher anpassen, da kein "OR = bla" vielfaches vorkommt.
    count(1) kann ein wenig schneller sein, da dort der inhalt von id dann nicht mehr abgefragt werden muss.

    >1 ist geschmackssache

    hier noch eine mögichkeit, um doppelte sportarten bei gleicher id auszuschließen

    Code:
    SELECT id 
    FROM ( select distinct id, sportart from table ) a
    WHERE sportart in ( "basketball", "fussball" )
    GROUP BY id
    HAVING COUNT(1) > 1;
    greetz
    Geändert von quinte17 (20-04-2006 um 15:49 Uhr)

  11. #11
    Registrierter Benutzer
    Registriert seit
    15.10.2005
    Ort
    Franken
    Beiträge
    362
    Subselect waren ja nicht möglich.

    Das mit dem IN is Geschmackssache, ich häng irgendwie an meinem OR.#

    Mit dem Count() hast du unrecht, der SQLOptimizer wirft den inhalt von Count sowieso weg, da er keinen Einfluss hat. ID erhöht nur die Lesbarkeit (bei 20-Zeilen-Querrys sehr sehr wichtig).
    Gleiches für das >= 2.
    Dank der Rekursion kann ich IF-Schleifen bauen.

    In neuem Glanz: www.turbohummel.de

  12. #12
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    des mit dem optimizer wusste ich noch nicht
    ich habe es halt so gelernt, bei count immer ne 1 reinzuschreiben, weil da ja eh immer die anzahl der zeilen dabei rauskommt, und die information dadrin wirklich egal ist.
    >= 2 ist für manche vielleicht lesbarer da hast du recht.
    mit dem OR allerdings bin ich der meinung, dass es mit 'IN' schöner ist wenn man mehr als 2 bedingungen hat. da wird dann der select nicht so lang und bleibt verständlicher.

    aber die mysql 4.1 kann doch schon derived tables oder etwa nicht? oder bin ich schon wieder zu lange auf 5.x.

    greetz

  13. #13
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Ist nett mal die ganzen SQL Befehle zu sammeln.
    (Entdecke die Möglichkeiten )

    Aber ich halte den Tabellenaufbau für falsch.

    Tabelle:
    ID | sportart
    -------------------------------
    1 | schwimmen
    1 | fussball
    1 | basketball
    2 | fussball
    2 | basketball
    3 | basketball
    4 | reiten

    Um es noch deutlicher zu machen. Was passiert z. B. wenn in der
    Spalte Sportart komplette Sätze eingetragen sind? Dann geht die
    Geschwindigkeit in den Keller. Jeder Satz wird dann noch doppelt
    und 3x usw. eingetragen, das kann es doch nicht sein!?
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  14. #14
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    da hast du ja auch recht
    diese tabelle ist noch nicht ganz fertig.. aber wollen wir denn hier alles verraten?

    greetz

  15. #15
    prograbbit
    Gast
    Hallo zusammen,

    ich habe ein ähnliches Problem wie boxa, allerdings bräuchte ich eine Lösung für eine Abfrage über mehrere Tabellen. Angenommen, ich suche die IDs von Personen, die schwimmen UND Fußball spielen (also so wie bei boxa) UND aber zusätzlich noch die IDs der Personen, die Deutsch UND Englisch sprechen.

    Ich habe also 2 Tabellen:
    ID | sportart
    ----------------
    1 | schwimmen
    1 | fussball
    2 | fussball
    3 | basketball
    ...

    ID | sprache
    ----------------
    1 | deutsch
    1 | englisch
    2 | spanisch
    3 | deutsch
    ...

    Als Ergebnis des Beispiels oben würde die ID 1 raus kommen.

    Gibt es eine Möglichkeit, auch für dieses Problem eine saubere und sichere UND-Abfrage hinzubekommen?

    Vielen Dank schon mal!!!
    Geändert von prograbbit (25-04-2006 um 10:26 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •