Bernie Spiekel: mysql: Datensätze ermitteln, die nicht in einer Liste vorkommen

Hallo Leute!

Ich komme einfach nicht weiter, es wäre sehr nett wenn ein SQL Profi mir hier weiterhelfen kann...

Ich habe eine Datenbank mit zwei Tabellen.

1. Keyword
ID    WORD
1     car
2     hamster
3     billboard
4     peanut
5     foo
[..]

2. Picture
ID    KEYWORD     [..]
1     2,3,4
2     4
3     1,2
[..]

In der Tabelle "Picture" sind also Keywordlisten der entsprechenden Keywords, die zum Bild gehöhren, gespeichert. Im obigen Beispiel ist also das Bild mit der ID 3 mit den Worten "car" und "hamster" bezeichnet.

Nun habe ich folgenden Wunsch:
Ich möchte herausfinden, ob es Einträge in der Tabelle "Keyword" gibt, die in keiner Keywordliste der Tabelle "Picture" vorkommen. Im obigen Beispiel wäre das "foo" - es existiert in keiner Liste unter "Picture".

Tja und dafür brauche ich eine SQL.
Meine bisherigen Versuche (Volllaie) sind kläglich gescheitert:

SELECT
picture.id
from picture
LEFT JOIN keyword
WHERE NOT FIND_IN_SET( keyword.id, picture.keyword)

Ich hoffe jemand kann mir weiterhelfen,
danke, Bernie

  1. Hi,

    wenn du die Möglichkeit hast, dein Datenmodell noch zu ändern, dann solltest du dies tun, umgehend. Es ist denkbar schlecht für das, was du damit tust.

    Du solltest einfach eine Tabelle einführen Picture_Keyword, bestehend aus der PictureId und KeywordId. Darüber kannst du dann Bildern beliebig viele Keywords zuordnen ohne evt. an maximale Feldlängen von varchar() und Co. gebunden zu sein.

    Ciao, Frank

    1. Hi,

      Du solltest einfach eine Tabelle einführen Picture_Keyword, bestehend aus der PictureId und KeywordId. Darüber kannst du dann Bildern beliebig viele Keywords zuordnen ohne evt. an maximale Feldlängen von varchar() und Co. gebunden zu sein.

      ... und einen unique-key über PictureId und KeywordId definieren um doppelte einträge zu vermeiden...

      Samoht

      1. Nein, kann leider nicht geändert werden. Also, weiss niemand eine passende SQL?

        Danke, Bernie

        1. Nein, kann leider nicht geändert werden.

          Schade, sehr schade, aber zumindest weisst du jetzt, dass dein Datenmodel miserabel ist.

          Also, weiss niemand eine passende SQL?

          Es ist im übrigen oft sehr unhöflich nach einer Verneinung einen Satz mit "Also" zu beginnen.

          Auss'm Kopf nicht, aber iirc kann mysql mit Regular Expressions arbeiten.

          Ansonsten hast du ja grundsätzlich vier fälle, auf welche du einzeln (aber immer noch in einer SQL) prüfen kannst

          • am Anfang nichts, dann Keyword, dann komma (am anfang einer Liste)
          • am Anfang nichts, dann Keyword, dann nichts (einzeln)
          • vorher komma, dann Keyword, dann komma (mitten drin)
          • vorher komma, dann Keyword, dann nichts  (am ende einer Liste)

          Vielleicht hilft dir das auf die Sprünge.

          Ciao, Frank