Ankündigung

Einklappen
Keine Ankündigung bisher.

Logisches UND

Einklappen

Unconfigured Ad Widget

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

  • Logisches UND

    Hallo,

    folgendes Problem:
    es liegt die Datenbank user, merkmal und user__merkmal vor.


    Datenbank "user" mit user_ID, name, usw.
    Datenbank "merkmal" mit merkmal_ID, groeße, gewicht, haarfarbe, usw.
    Datenbank user__merkmal mit 2 spalten für user_ID und merkmal_ID. weil ein user kann mehrere merkmale haben!

    Meine Abfrage nun mit: SELECT user_ID FROM user__merkmal WHERE merkmal_ID=1 AND merkmal_ID=3
    (beide Merkmale sollen erfüllt sein)

    funktionieren tut das aber nicht. Was mache ich falsch? Klammern setzen in der Abfrage bringt auch nichts.
    OR (oder) anstelle von AND funktioniert.


    danke


  • #2
    Eine Spalte kann nicht gleichzeitig den Wert 1 und den Wert 3 haben, deswegen kriegst du auch kein Ergebnnis.

    Code:
    SELECT user_id
    FROM user_merkmal
    WHERE merkmal_id IN (1, 3)
    GROUP BY user_id
    HAVING COUNT(*) = 2

    Kommentar


    • #3
      Niemals kann eine ID gleichzeitig 1 und 3 sein...
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        wie wird so ein problem dann gelöst? wenn ich für jedes merkmal ein eigene tabelle anlege und dann prüfe ob user_ID in merkmal-Tabelle 1 und merkmal-Tabelle3 steht? die schnittmenge daraus ist dann logisches AND.


        zur info: für ein merkmal muss kein zusätzlich wert gespeichert werden.

        Kommentar


        • #5
          Zitat von jmaier Beitrag anzeigen
          wie wird so ein problem dann gelöst?
          Zum Beispiel so wie ich es gezeigt habe.

          Kommentar


          • #6
            ahh jetzt geht es. danke super!
            das liebe ich an einem forum. ich brauche keine "vollständige" lösung. nur ein paar hinweise und eigenrecherche

            Kommentar


            • #7
              frage:
              eine zweite Abfrage mit anderer Datenbank mit IN in einem Query funktioniert nicht, oder?

              Kommentar


              • #8
                Warum sollte es nicht funktionieren?
                "IN" hat doch keine Nutzungsbeschränkung.

                Kommentar


                • #9
                  ok. Eine Frage zur syntax:
                  dieses HAVING COUNT(*) = 2 bedeutet: ich suche zwei treffer in der mit IN beschriebenen Datenbank.


                  wenn ich jetzt eine zweite Datenbank durchsuchen möchte mit 3 Treffer? schreibe ich dann so:
                  WHERE merkmal_id IN (1, 3) HAVING COUNT(*)=2 AND merkmal2_ID IN (7 ,6, 5) HAVING COUNT (*)=3

                  GROUP BY sorgt dafür dass ich keine mehrfachnennungen der IDs bekomme? richtig?

                  Kommentar


                  • #10
                    Allem Anschein nach ist dein Datenbankdesign kaputt.
                    Stelle mal die DB als SQL-Dump mit einigen Testdaten hier zur Verfügung(CREATE Statement), dann sehen wir weiter.

                    Kommentar


                    • #11
                      Zitat von jmaier Beitrag anzeigen
                      ok. Eine Frage zur syntax:
                      dieses HAVING COUNT(*) = 2 bedeutet: ich suche zwei treffer in der mit IN beschriebenen Datenbank.
                      Mit IN beschreibt man eine Liste an Werten und keine Datenbank.

                      WHERE spalte IN (1, 2, 3) ist vergleichbar mit WHERE spalte = 1 OR spalte = 2 OR spalte = 3.

                      Das wird übrigens auch im MySQL-Handbuch erklärt.

                      Zitat von jmaier Beitrag anzeigen
                      wenn ich jetzt eine zweite Datenbank durchsuchen möchte mit 3 Treffer? schreibe ich dann so:
                      WHERE merkmal_id IN (1, 3) HAVING COUNT(*)=2 AND merkmal2_ID IN (7 ,6, 5) HAVING COUNT (*)=3
                      Du solltest wirklich korrekte Wörter verwenden, sonst missversteht man dich sehr schnell.

                      Korrekt ausgetrückt: Du möchstest nach 3 anderen Werten in einer ander Spalte abfragen. Wobei hier wohl dein Tabellendesign kaputt ist, denn nummerierte Spalten deuten fast immer auf ein Fehldesign hin.

                      Zitat von jmaier Beitrag anzeigen
                      GROUP BY sorgt dafür dass ich keine mehrfachnennungen der IDs bekomme? richtig?
                      GROUP BY dient, wie der Name schon sagt, zum Gruppieren von Daten. Bei einem GROUP BY user_id werden alle Daten nach der Spalte user_Id gruppiert. Auf Spalten dieser Gruppen lassen sich Aggregatfunktion wie z.B. SUM(), um die Summe zu bilden, anwenden. In dem Fall wird COUNT() verwendet, um die Anzahl der Datensätze in den Gruppen zu liefern. Der * in COUNT(*) deshalb, weil um die Anzahl zu bilden keine konkrete Spalte erforderlich ist. * steht als Platzhalter für alle Spalten.

                      Kommentar


                      • #12
                        ok. also das ganze ist eine studienarbeit für bauingenieure. über datenbanken haben wir nichts gelernt. selbst beibringen ist das ziel.
                        Aufgabe: Es sollen Pläne (Grundrisse von Wohnhäusern) in einer Datenbank erfasst werden. Dazu dient die Tabelle "plan" mit der eindeutigen plan_ID.

                        frage.JPG

                        dachform.JPG
                        gebaeudeform.JPG
                        Ein Plan kann nur EINE Gebäudeform und EINE Dachform haben. Deshalb die jeweiligen eindeutigen IDs.
                        Aber bei den Merkmalen können mehrere auftreten:

                        merkmal.JPG

                        Deshalb die Zuordnungstabelle mit namen plan_ID_merkmal_ID: Hier werden plan_ID und merkmal_ID zusammengeführt.
                        Plan mit Nr 1 hat Doppeleintrag: Sichtdachstuhl und ein separates Kinderbad usw.
                        plan__merkmal.JPG

                        Ziel ist es nun eine Eingabemaske mit Formularen so zu gestalten dass eine Suche nach Gebäudeform, Dachform und eben Merkmalen möglich ist.
                        Nach Gebäudeform, Dachform zu suchen ist leicht. Brauche ich nicht erwähnen. Aber bei Merkmalen komm ich nicht weiter. Deshalb meine Frage.
                        Ist diese Vorgehensweise sinnvoll? besten dank



                        Angehängte Dateien

                        Kommentar


                        • #13
                          Ok, das ist dann vielleicht doch noch etwas schief.
                          Die AND Suche, die Du gesucht hast und die mit Group by Having umgesetzt wurde liefert Ergebnisse die tatsächlich alle angegebenen Merkmale besitzen.
                          Wenn Du davon sprichst, dass mehrere Merkmale gleichzeitig auftreten KÖNNEN, soll die Suche dann wirklich nur Ergebnisse bringen, bei denen alle Angaben zutreffen?

                          Anhand Deiner Nachfrage und der gezeigten Tabellen:
                          Wo ist Merkmal2_id?

                          Oder ist damit "versehentlich" eine Formularvariabel für einen zweiten Merkmalfilter?

                          Und konkret: Die Having COunt Nummer kannst Du nicht vervielfältigen, das gilt für das Gesamtergebnis
                          Du müsstest es eher zusammenrechnen.

                          Kommentar


                          • #14
                            Zitat von jmaier Beitrag anzeigen
                            ok. also das ganze ist eine studienarbeit für bauingenieure. über datenbanken haben wir nichts gelernt. selbst beibringen ist das ziel.
                            Aufgabe: Es sollen Pläne (Grundrisse von Wohnhäusern) in einer Datenbank erfasst werden. Dazu dient die Tabelle "plan" mit der eindeutigen plan_ID.

                            Was ist denn Sinn und Zweck der Tabelle plan__merkmal? Welchen Vorgang oder Sachverhalt bildet sie ab?

                            Kommentar


                            • #15
                              Kannst du bitte statt dieser Screenshots oder was auch immer das ist einen DB-Dump schicken?!

                              Kommentar

                              Lädt...
                              X