IN() nicht mit OR?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • IN() nicht mit OR?

    Hi,

    ich weiß nicht ob der Titel des Threads geschickt gewählt ist, aber mir ist nicht bekannt wie man das ganze nennt...

    Folgendes Beispiel:

    Hoteldatenbank in der die Hotels Eigenschaften haben. Relation 1:N.

    Code:
    tab hotel (h)
    ------------------------------
    | id | name                  |
    ------------------------------
    |  5 | Grand Hotel München   |
    |  7 | Adlon Berlin          |
    | .. | ...                   |
    ------------------------------
    
    tab eigenschaften (e)
    ------------------------------
    | id | name                  |
    ------------------------------
    | 13 | TV auf Zimmer         |
    | 39 | Minibar               |
    | 42 | Balkon                |
    | .. | ...                   |
    ------------------------------
    
    tab rel (r)
    -----------------------------
    | hotel_id | eigenschaft_id |
    -----------------------------
    |        5 |             13 |
    |        5 |             42 |
    |        7 |             13 |
    |        7 |             39 |
    |       .. |             .. |
    -----------------------------

    Um nun alle Hotels zu finden die "TV auf Zimmer" oder "Minibar" anbieten nutzt man folgende Query:

    Code:
      SELECT h.name 
      
      FROM 
      hotel h 
      
      JOIN rel r 
      ON r.hotel_id = h.hotel_id AND r.eigenschaft_id IN(13, 39)

    Soweit kein Problem.
    Nur wie finde ich jetzt alle Hotels die "TV auf Zimmer" UND(!) "Minibar" haben? (natürlich auch mit mehr als 2 Eigenschaften)

    Ich dank euch schonmal

  • #2
    na mit AND verknüpfen
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      Hi,

      das funktioniert leider nicht. Es gibt ja keine eigenschaft_id die 13 UND 39 ist...

      Code:
        SELECT 
        h.id, 
        h.name, 
        r.eigenschaft_id
        
        FROM 
        hotel h 
        
        JOIN rel r 
        ON r.hotel_id = h.hotel_id
      
        WHERE 
        h.hotel_id = 7
      ergiebt:
      Code:
      ---------------------------------------------
      | h.id | h.name          | r.eigenschaft_id |
      ---------------------------------------------
      |    7 | Adlon Berlin    |               13 |
      |    7 | Adlon Berlin    |               39 |
      ---------------------------------------------
      Somit kann r.eigenschaft_id niemals 13 UND 39 sein...
      Zuletzt geändert von prego; 14.04.2009, 11:08.

      Kommentar


      • #4
        Code:
        SELECT
            DISTINCT h.name 
        FROM 
            hotel h 
        INNER JOIN
            rel r ON ( r.hotel_id = h.hotel_id )
        WHERE
            r.eigenschaft_id IN (13, 39)
        eigenschaft_id gehört nicht zur JOIN-Bedingung.

        Ein Sub-Select ginge auch:
        Code:
        SELECT
            name 
        FROM 
            hotel
        WHERE
            hotel_id IN (
                SELECT hotel_id FROM rel WHERE eigenschaft_id IN (13, 39)
            )
        Zuletzt geändert von h3ll; 14.04.2009, 11:47.

        Kommentar


        • #5
          danke.

          Aber das ist nur eine andere Schreibweise meiner vorherigen Query.
          Ich bekomme damit immer noch die Hotels die Eigenschaft 13 ODER 39 haben.

          Das DISTINCT würde ich übrigens als GROUP BY h.id schreiben. Hab ich aber absichtlich aus Gründen der Einfachheit für dieses Beispiel hier weg gelassen.

          Kommentar


          • #6
            Achso. Dann:
            Code:
            SELECT
                h.name 
            FROM 
                hotel h 
            INNER JOIN
                rel r ON ( r.hotel_id = h.hotel_id )
            WHERE
                r.eigenschaft_id IN (13, 39)
            GROUP BY
                h.name
            HAVING
                COUNT(*) = 2

            Kommentar


            • #7
              Also die Anzahl der gejointen Eigeschaften zählen und schaun ob es die Anzahl der geforderte Eigenschafte sind.... hmmm.... ok - ist ne Lösung, super... vielen Dank.

              Gibts noch nen besseren weg?

              Kommentar


              • #8
                Gibt afaik keine bessere Lösung.

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar

                Lädt...
                X