snorri: SQL: SELECT nach einem Einzelwert in einem SET-Feld?

Hi alle,

in einer kleinen Datenbank, die Personen beinhaltet, habe ich die Fremdsprachenkenntnisse in einem SET-Feld gespeichert:

CREATE TABLE person (
  sprache set('Englisch','Deutsch','Französisch'),
  ...
)

D.h. jede Person kann eine oder mehrere Sprachen (oder auch keine davon, theoretisch). In der Datenbank stehen jetzt drei Personen: A kann Deutsch und Französische, B kann Deutsch und Englisch, C Englisch und Französisch.

Wie muss das SELECT-Statement aussehen, damit mir alle Personen ausgegeben werden, die Deutsch sprechen?

SELECT * FROM person WHERE sprache='Deutsch'
... gibt nur die aus, die _ausschließlich_ Deutsch sprechen.

SELECT * FROM person WHERE 'Deutsch' IN (sprache)
... ebenfalls, seltsamerweise.

SELECT * FROM person WHERE sprache LIKE '%Deutsch%'
... funktioniert, scheint mir aber nicht das Gelbe vom Ei zu sein (würde z.B. auch Leute ausgeben, die "Schweizer Deutsch" sprechen, um ein etwas bemühtes Beispiel zu verwenden).

Für so etwas muss es doch eine vernünftige Syntax geben, oder?

Danke für alle Tipps!

-- snorri

  1. Hi,

    Für so etwas muss es doch eine vernünftige Syntax geben, oder?

    Es gibt ein durchaus vernuenftiges Handbuch, in dem man das nachlesen kann - ueberraschenderweise sogar bei der Beschreibung des Datentyps ... also, hopphopp!

    MfG ChrisB

    1. Hat Dir Deine Mama heute das Pausenbrot falsch belegt oder woher die miese Laune? Solch alberne Herablassung hat nur nötig, wer sich auf Kosten anderer künstlich erhöhen will. Musst Du Dir selbst überlegen, ob Du meinst das nötig zu haben.

      Trotzdem Danke für den Hinweis auf die Datentyp-Seite, ich hatte beim SELECT-Statement gesucht.

      Für alle, die eine _hilfreiche_ Antwort auf das obige Problem suchen: Die Funktion heißt "FIND_IN_SET()" und wird in der Online-Dokumentation auf dieser Seite beschrieben:

      http://dev.mysql.com/doc/refman/5.0/en/set.html

      -- snorri

  2. Hallo

    in einer kleinen Datenbank, die Personen beinhaltet, habe ich die Fremdsprachenkenntnisse in einem SET-Feld gespeichert:

    das halte ich persönlich für eine schlechte Designentscheidung.

    CREATE TABLE person (
      sprache set('Englisch','Deutsch','Französisch'),
      ...
    )

    Für so etwas muss es doch eine vernünftige Syntax geben, oder?

    äh, wie bitte? Verwende ein vernünftiges Tabellendesign - und Du hast kein Problem :-) Das Hinzufügen einer weiteren Sprache erfordert eine Änderung der Tabellenstruktur - das ist richtig toll!

    Wenn Du bei Deinem kaputten Design bleiben willst, dann verwende eine dazu passende Funktion. Wie findet man die? Im Handbuch natürlich. Daher:

    1. Geh zum MySQL-Handbuch, klick

    Wie könnte es weitergehen? Ach, da gibt es ja eine Navigation. Is ja toll.
    2) Wähle in der Navigation den Eintrag "Funktionen und Operatoren", klick

    Und nu? Gibts ja viele Bereiche von Funktionen :-(
    Da Du SET verwendest, weißt Du, dass es sich bei SET um einen Stringtyp handelt.
    3) Wähle die Stringfunktionen aus, klick

    Jesses, viele, viele Funktionen. Schlimm! Wie soll man da den Überblick behalten?
    Schau Dir halt die Kurzbeschreibung eine nach der anderen an.
    4) Da gibt es in der Tat die Funktion FIND_IN_SET, klick.

    Was ist daran so schwierig, dass Du gescheitert bist?

    Freundliche Grüße

    Vinzenz, der SET so gut wie nie verwendet.

    1. Was ist daran so schwierig, dass Du gescheitert bist?

      Ich habe beim SELECT-Statement gesucht und nicht beim Datentyp. Was ist daran so ungewöhnlich, dass man in derart arroganter Weise antworten muss? :-)

      -- snorri

      1. Hallo

        Was ist daran so schwierig, dass Du gescheitert bist?
        Ich habe beim SELECT-Statement gesucht und nicht beim Datentyp.

        und hast folgendes nicht beachtet:

        <zitat>
            The WHERE clause, if given, indicates the condition or conditions that rows
            must satisfy to be selected. where_condition is an expression that evaluates
            to true for each row to be selected. The statement selects all rows if there
            is no WHERE clause.

        In the WHERE clause, you can use any of the functions and operators that
            MySQL supports, except for aggregate (summary) functions. See Chapter 11,
            Functions and Operators.
        </zitat>

        Was ist daran so ungewöhnlich,

        Was ist daran so schwierig, diesem Hinweis zu folgen. Und: es sich zu merken?
        Danach geht der direkte Weg zu den Funktionen und Operatoren - ohne den Umweg über SELECT.

        dass man in derart arroganter Weise antworten muss? :-)

        Arrogant? Wenn Du meinst, dass Hilfe, die Dir den Weg zu einer Lösung für Dein Problem zeigt, das Du nicht hättest, wenn Du ein vernünftiges Tabellendesign hättest, arrogant ist ... Woran bist Du _vorher_ gescheitert?

        Wenn jemand auf den recht unüblichen Datentyp SET kommt, dann sollte er sich auch damit vertraut machen, wie er damit umgeht - *bevor* er sich für diesen Datentyp entscheidet. Hinweise dazu gibt es - oh Wunder - genau bei diesem Datentyp. Ja, darauf hat Dich ChrisB hingewiesen. Das war Deiner Meinung nach natürlich arrogant.

        Soll ich Dir wegen Deiner Frage und Deinen beiden Antworten auf die Beiträge von ChrisB und mir nun arrogante Ignoranz unterstellen?

        Grüße

        Vinzenz

        1. Ja, darauf hat Dich ChrisB hingewiesen. Das war Deiner Meinung nach natürlich arrogant.

          Ein sachlicher Hinweis kann nicht arrogant sein. Wohl aber ein Tonfall. Ist doch klar, oder? :-)

          Ich weiß ja, dass hier viele Leute Fragen stellen, die einfach mal drauflos programmieren, sich in irgendwas verstricken und dann hoffen, dass im Forum jemand ihren Wirrwarr zum Laufen bringen kann.

          Denkbar wäre aber doch ohne weiters auch, dass ich gerade dabei bin, genau das zu tun was Du sagst: Nämlich mich mit dem Datentyp zu befassen, bevor ich ihn produktiv einsetze (oder eben auch nicht).

          Mein Beispiel ist Testfall, an dem ich ausprobiere, was ich lerne. Dabei bin ich auf eine Frage gestoßen, deren Lösung ich nicht gefunden haben. Das mag mein Fehler sein, rechtfertigt aber nicht, jemanden wie ein dummes Kind zu behandeln wie ihr zwei es so gerne tut. Wer sich so verhält, will nicht wirklich helfen, sondern in erster Linie andere herabsetzen, um sich selbst toll zu fühlen. Wenn Du das nötig hast, will ich Dir dieses kleine Vergnügen aber gönnen, das halte ich schon aus. :-)

          -- snorri

          1. Hi snorri!

            Ich verstehe grundsätzlich das Problem; manchmal bekommen gerade Leute, die sich neu mit einem Thema befassen und "triviale Fragen" oder "Fragen, die es schon öfters gab" stellen oder "den falschen Ansatz wählen" hier etwas ruppige Antworten.

            Aber eines darf man nicht übersehen: Du hast (wie bereits viele Andere vorher) hier tatsächlich sehr zielführende Hinweise erhalten  - und das (wie immer hier) für lau.

            Deshalb würde ich sagen, dass es schon OK ist, zu sagen, wann man sich auf den Schlips getreten fühlt - auf der anderen Seite sollte man aber nicht vergessen, dass einem geholfen wurde und dass die Helfer hierfür nichts bekommen.

            Und natürlich bestimmt jeder selbst seinen Ruf hier im Forum (und als Teilnehmer auch den des Forums im Gesamten). Drum: einfach weiter mitlesen, versuchen, nett zu antworten, Leuten helfen und sich freuen, wenn es klappt und der Groschen fällt - und nicht zu sehr über den Stil der Anderen ärgern.

            Grüsse,
            Richard

            1. Hallo Richard!

              Aber eines darf man nicht übersehen: Du hast (wie bereits viele Andere vorher) hier tatsächlich sehr zielführende Hinweise erhalten  - und das (wie immer hier) für lau.

              Dafür habe ich mich ja auch artig bedankt. :-) Und das ist auch der Grund, warum ich nach wie vor hier schreibe (und zwar nicht nur fragend, sondern auch antwortend). Deshalb kenne ich den recht rüden Tonfall in diesem Forum auch schon. Trotzdem reißt es mich ab und zu mal, etwas dazu zu sagen, wenn mir jemand gar zu selbstherrlich-besserwisserisch kommt.

              -- snorri

          2. Hallo snorri,

            Ein sachlicher Hinweis kann nicht arrogant sein. Wohl aber ein Tonfall. Ist doch klar, oder? :-)

            Ich hör' nix. ;o)

            Im Ernst: Der Tonfall ist das, was du in deinem Kopf hörst, wenn du einen Text liest, nicht etwa das, was der, der die Antwort schrieb, in seinem Kopf hörte, als er die Antwort schrieb.

            Wenn also jemand dich zum Handbuch schickt und ein "hopphopp" dazuschreibt, kann es gut sein, dass er dabei etwas schräg gegrinst hat und das in gutmütiger Weise humorvoll meinte; wenn ein anderer dir eine Anleitung schreibt, wie du dich durch das Handbuch klickst (was dir natürlich auch noch ein bisschen Arbeit abnimmt), kann es gut sein, dass er deine Recherchefähigkeiten unterschätzt; und wenn zu guter Letzt noch einer dieser Menschen deine Designentscheidung in Zweifel zieht, dann kann es wirklich sein, dass er das aus (eventuell sogar leidvoller) Erfahrung tut.

            Nu' mach' dir man nix draus, gib a) den Leuten, die dir antworten immer eine zweite Chance und b) deinem Arroganzdetektor einen Dämpfer. :o)

            File Griese,

            Stonie

            --
            It's no good you trying to sit on the fence
            And hope that the trouble will pass
            'Cause sitting on fences can make you a pain in the ass.
            Und im Übrigen kennt auch Stonie Wayne.