LIKE Abfrage

  • SQL

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    LIKE Abfrage

    Hallo!

    Nehmen wir an ich habe eine mySQL Tabelle mit

    ID
    tags
    title
    1
    eis,himbeere
    Himbeer Eis
    2
    pudding,schoko,vanille
    Schoko-Vanille Pudding

    Und wenn ich in der Suche eingebe Ich möchte ein Eis mit Himbeere und Schoko essen.

    Dann soll er schauen welche Tags in der Suche vorkommen und nur wenn ab 2 Tags gleich sind (also hier Eis und Himbeere ) dann soll es (in dem Fall das Himbeer Eis) mit

    SQL-Abfrage

    1. SELECT *
    ausgegeben werden.
    Der Schoko-Vanille Pudding wird aber nicht ausgegben, weil nur ein Tag übereinstimmt und nicht >= 2.

    Ich hoffe ich habe das verständlich erklärt, weiß jemand wie SQL Abfrage dafür geht?

    Danke und LG
    Whos Faster ALPHA: Bald....
    Hallo!

    Ich möchte aber nicht die Tags immer neu in eine andere Tabelle hinzufügen müssen. Bzw. was wäre dein Vorschläg, wie würde die Tabelle deiner Meinung nach aussehen?

    LG
    Whos Faster ALPHA: Bald....

    Digot schrieb:

    Ich möchte aber nicht die Tags immer neu in eine andere Tabelle hinzufügen müssen

    Ist doch aber mit einer Normalisierten DB viel einfacher ...
    Tabelle: Sorten
    IDTitel
    1Himbeer Eis
    2Schoko-Vanille Pudding

    Tabelle: Tags
    IDTag
    1Eis
    2Himbeere
    3pudding
    4schoko

    Tabelle: Sorte_Tags
    Sorte_IDTag_ID
    11
    12
    23
    24
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Hat sie doch ....
    schau dir vielleicht mal das hier von ErfinderDesRades an

    Die relationale Grundidee
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    @Manü
    Deine Tag-Tabelle ist in meinen Augen ins Absurdum geführt.
    Ich würde dieser Tabelle keine numerische Autoinkrement-ID geben, sondern den Text an sich als Unique Primary Key verwenden.
    Zum einen ist es etwas lesbarer.
    Zum anderen kann ich damit verhindern, dass jemand auf die Idee kommt, ein zweites Eis-Tag anzulegen.

    Ansonsten gehe ich mit deiner Grundidee konform.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Die Tabelle soll nicht lesbar sein, sie soll funktionieren, und so funktioniert es nun mal. Er hat sie lediglich in die 3 Normalform gebracht und das ist auch richtig so. So wie ich das verstanden hab sind die Tags statisch, somit ist das Problem mit doppelten Tags nicht mehr in der Welt, ansonsten löst man es halt mit einer Abfrage (was man imho sowieso tun soltle).

    petaod schrieb:

    sondern den Text an sich als Unique Primary Key verwenden

    ich glaube da hat mir vor einigen Jahren ein Lehrer mal ziemlich ins gewissen gesch... das eine Eindeutige Zuweisung immer über einen nummerischen Wert zu erfolgen hat ... das ist irgendwie in Fleisch und Blut übergegangen und daher immer eine ID ;)
    Zumal Unique-Wert als Zahl imho weniger gehrinschmalz beansprucht ... aber Ja in dem Fall wäre es möglich ... dann ist aber die Frage ob man sich die Tag-Tabelle nicht vielleicht komplett sparen kann

    petaod schrieb:

    Die dritte Normalform schreibt doch nicht vor, dass der Schlüssel numerisch sein muss.

    Wie würde man zu Sheldon sagen? : "Das sind gesellschaftliche Konventionen" :D
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Das würde ich gar nicht mal als Konvention beschreiben, sondern als Regel der Performance-Verbesserung und Speicherplatzeinsparung, die eigentlich bei jedem erstellten Projekt mit MySQL eine Rolle spielen sollte. Demnach ist es einfach vollkommener Schwachsinn Zeichenfolgen, die mehrmals vorkommen, immer wieder auszuschreiben.

    Manü schrieb:

    dann ist aber die Frage ob man sich die Tag-Tabelle nicht vielleicht komplett sparen kann
    Wegen dem Unique Key bräuchte man sie.

    Rinecamo schrieb:

    als Regel der Performance-Verbesserung und Speicherplatzeinsparung
    Speicherplatz kostet es weniger, wenn man die numerische Spalte weg lässt. ;)
    Die Performance wird von der Indextabelle bestimmt, die in beiden Fällen angelegt wird.
    Performancekritisch wird es dann, wenn man die Tag-Tabelle nicht indizieren würde.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Man beachte das Smiley!

    Wenn ich die numerische Spalte gar nicht anlege, spare ich natürlich die 4-8 Byte pro Record in der Tags-Tabelle.
    Das Smiley soll andeuten, dass das eine Milchmädchenrechnung ist.
    Sobald die Tag-Texte länger als als die Nummer sind, erhöht sich mit jedem Gebrauch des Tags in der Zwischentabelle der Platzbedarf schneller als bei Verwendung von Nummern.

    Andererseits, wenn man die Tag-Länge tatsächlich auf CHAR(4) oder CHAR(8) begrenzt (je nachdem, ob der numerische Index als INT oder als BIGINT gespeichert wird), wird man im Falle der zusätzlichen numerischen Spalte immer mehr Platz benötigen.
    Bei VARCHAR oder TEXT verschiebt sich die Aussage nochmals.

    Allerdings ist die Diskussion darüber sehr akademisch.
    Datenbankoptimierung wird seltenst auf Speicherplatzoptimierung ausgelegt.
    Zumindest nicht in dem Bereich, den wir gerade besprechen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Die Zuordnung der Tags wird erfolgt nicht in der Haupttabelle.
    Das passiert nur in der Zwischentabelle.
    Schau dir die Tabelle Sorte_Tags in Post #4 an.
    Dort werden alle zutreffenden Kombinationen von Sorte und Tag als eigenständiger Record hinterlegt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    ja, ohne die relationale GrundIdee zu studieren und zu kapieren, wirst du hier den Leuts für alle Zeiten Löcher in den Bauch fragen.

    Dort ist die Frage beantwortet, aber zunächstmal bitte klare Begrifflichkeiten: HauptTabellen gibts nicht, bestenfalls ParentTables, und davon gibts in diesem Falle 2.

    So jetzt gugge Manüs hübsches Bildle, dass du genau unterscheidest, was ich mit "Sort", "Tag" und "Sorte_Tag" meine:
    Mehrere Tags kannst du einem Sorten-Datensatz zuordnen, indem du mehrere Sorte_Tag-Datensätze anlegst, die auf denselben Sorte-Datensatz verweisen, aber mit dme anneren ForeignKey auf jeweils einen anneren Tag.

    Jo - ist jetzt Datenbänker-Chinesisch ("ForeignKey", "verweisen"), aber das musste halt lernen (und ist eiglich nicht sooo schwer)

    Ich kann dir auch aufzeigen, wie man das ganz praktisch umsetzt: vier Views-Videos
    Beachte: Dort besteht ein relationales Datenmodell, aber es gibt noch keine Datenbank. Select-Abfragen würde man mit Linq formulieren, das ist so ähnlich, aber wesentlich sicherer und einfacher als Sql.
    Meist braucht man aber nichtmal explizite Select-Abfragen, sondern setzt nur einfache Filter.

    Jdfs Auf deinem Lernlevel täte ich von einer DB auch erstmal abraten: Datenbänkerei-Einstieg

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()