Maik W. aus E.: Stichwort/Tag-Verwaltung mit mySQL5

Tach zusammen,

ich arbeite hier an einer klassischen "Tag-Verwaltung", allerdings für Literaturdaten. Ich habe in einer mySQL-DB (5.0.51) eine Tabelle 'Stichworte' mit id, eine Tabelle 'Artikel' mit id und eine Tabelle 'stich_id_artikel_id', in die für jede Verknüpfung ein Eintrag der Ids eingetragen ist. Klassische Normalisierung halt.

Jetzt brauche ich eine Abfrage, um die id der Artikel anzuzeigen, die zwei (oder mehr) Stichworten zugeordnet sind.

Ich habe es mit einem SELFJOIN versucht, ebenso die Syntax, die Ilja mir damals gegeben hatte, nichts bringt das gewünschte Ergebnis. Bei der Recherche im Archiv drängt sich mir der Eindruck auf, daß man solche Abfragen in mehrere Schritte zerlegen muß, aber vielleicht vertue ich mich da, weil ich ja keine Kreuztabellenabfrage brauche, oder?

Danke für Eure Hilfe

Maik

--
Margin-Regler am Control-Data-Tischrechner im RRZE Erlangen
Mehr margin! Sag ich ja immer...
  1. Hi!

    Jetzt brauche ich eine Abfrage, um die id der Artikel anzuzeigen, die zwei (oder mehr) Stichworten zugeordnet sind.

    Übersehe ich was oder ist die Lösung tatsächlich so einfach: Gruppiere über die Artikel-ID und schränke im HAVING auf COUNT(*) > 1 ein.

    Lo!

    1. Tach auch dedlfix,

      Jetzt brauche ich eine Abfrage, um die id der Artikel anzuzeigen, die zwei (oder mehr) Stichworten zugeordnet sind.

      Übersehe ich was oder ist die Lösung tatsächlich so einfach: Gruppiere über die Artikel-ID und schränke im HAVING auf COUNT(*) > 1 ein.

      Ja, und nein. Sorry, ich habe unsauber formuliert... Es geht um zwei oder mehr _bestimmte_ Stichworte. Also genauer:

      "Gib mir aus der Tabelle 'stich_id_artikel_id' die 'artikel_id's, zu denen es einen Eintrag mit der stichwort_id '1639' und mit der stichwort_id '5325' (usw) gibt."

      Dann wird's schwieriger...

      Danke,

      Maik

      --
      Margin-Regler am Control-Data-Tischrechner im RRZE Erlangen
      Mehr margin! Sag ich ja immer...
      1. Hi,

        Übersehe ich was oder ist die Lösung tatsächlich so einfach: Gruppiere über die Artikel-ID und schränke im HAVING auf COUNT(*) > 1 ein.

        Ja, und nein. Sorry, ich habe unsauber formuliert... Es geht um zwei oder mehr _bestimmte_ Stichworte. Also genauer:

        "Gib mir aus der Tabelle 'stich_id_artikel_id' die 'artikel_id's, zu denen es einen Eintrag mit der stichwort_id '1639' und mit der stichwort_id '5325' (usw) gibt."

        Dann wird's schwieriger...

        Nein, wird's nicht - dann schränkst du die Auswahl der Datensätze mit einer entsprechenden WHERE-Klausel ein, bevor du zählst.

        Lediglich die per HAVING abgefragte Anzahl muss dann noch der Anzahl der Vergleichskriterien angepasst werden. Aber das ist ja auch kein großes Ding, wenn man die Query dynamisch per Script generiert.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Tach auch ChrisB,

          "Gib mir aus der Tabelle 'stich_id_artikel_id' die 'artikel_id's, zu denen es einen Eintrag mit der stichwort_id '1639' und mit der stichwort_id '5325' (usw) gibt."

          Dann wird's schwieriger...

          Nein, wird's nicht - dann schränkst du die Auswahl der Datensätze mit einer entsprechenden WHERE-Klausel ein, bevor du zählst.

          Okay, mit einem Stichwort funktionierts:

            
          SELECT dok_id  
          FROM `stichwort_dok_rel_sys`  
          WHERE stichwort_id = '1639'  
          GROUP BY dok_id  
          HAVING COUNT( * ) >0  
          
          

          Nur, wenn man zwei Werte abfragen will, kommt kein Ergebnis:

            
          SELECT dok_id  
          FROM `stichwort_dok_rel_sys`  
          WHERE stichwort_id = '1639'  
          AND stichwort_id = '5325'  
          GROUP BY dok_id  
          HAVING COUNT( * ) >0  
          
          

          Lediglich die per HAVING abgefragte Anzahl muss dann noch der Anzahl der Vergleichskriterien angepasst werden. Aber das ist ja auch kein großes Ding, wenn man die Query dynamisch per Script generiert.

          Ah, ich glaube daran liegt's, denn

            
          SELECT dok_id  
          FROM `stichwort_dok_rel_sys`  
          WHERE stichwort_id = '1639'  
          OR stichwort_id = '5325'  
          GROUP BY dok_id  
          HAVING COUNT( * ) >1  
          LIMIT 0 , 30  
          
          

          macht es richtig. Das ist es doch, oder?

          Maik

          --
          Margin-Regler am Control-Data-Tischrechner im RRZE Erlangen
          Mehr margin! Sag ich ja immer...
          1. Hi,

            Lediglich die per HAVING abgefragte Anzahl muss dann noch der Anzahl der Vergleichskriterien angepasst werden. Aber das ist ja auch kein großes Ding, wenn man die Query dynamisch per Script generiert.
            Ah, ich glaube daran liegt's

            Nein, es lag daran, dass du vorher AND verwendet hast - es gibt aber keinen Datensatz, in dem die stichwort_id 1639 UND 5325 gleichzeitig ist.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            1. Tach auch Chris,

              Ah, ich glaube daran liegt's
              Nein, es lag daran, dass du vorher AND verwendet hast - es gibt aber keinen Datensatz, in dem die stichwort_id 1639 UND 5325 gleichzeitig ist.

              Meh.

              Danke und Grüße

              Maik

              --
              Margin-Regler am Control-Data-Tischrechner im RRZE Erlangen
              Mehr margin! Sag ich ja immer...