Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Rezepte finden wo Zutat nicht vorhanden

Begonnen von NoFear23m, April 02, 2011, 09:44:45

⏪ vorheriges - nächstes ⏩

NoFear23m

Hallo Leute

Stehe wieder mal vor einem kleinen Problem.

ICh habe eine Tabelle "tblRezept" und eine Tabelle "tblZutaten" welche natürlich in Bezeihung stehen.

Meine frage: Ist es denn möglich mittels Abfrage herauszufinden welche Rezepte ohne gewisse Zutaten sind.
Ich würde dann per Code den SQL String zusammensetzen um so mehrere Zutaten abzufragen.

Beispiel: Ich würde gerne die Rezepte IDs von allen Rezepten wo kein Zucker und keine Milch enthalten ist.
Achja, wenn geht bräuchte ich das umgekehrt auch. Also Rezepte finden die x Zutaten enthalten. (Resteverwertung)

Schöne Grüße an das komplette Forum.
Sascha



Diese Ausstrahlung! Dieses Lächeln! Diese Intelligenz!
Diese Wunderschönen Augen! Aber genug von mir. Wie geht's Dir?


NoFear23m

Grüße dich Franz

Danke für deine rasche Antwort.

ICh glaube ich meinte aber was anderes.
Anbei  mal ein Abbild der DB.

Ich möchte ja nicht die Datensätze aus A welche nicht in B sind.

Es gibt pro Rezept ja mehrere Zutaten. ICh schaffe es das ich die Datensätze finltere welche angegeben wurden. Aber da es mehrere Zutaten gibt bekomme ich ja dann trotzdem erst wieder die ID.

Vieleicht hilft das ja was ich bis jetzt habe.
ICh setze den SQL String zusammen. Jetzt möchte ich alle ID`s von Rezepte haben wo gewisse Zutaten nicht vorhanden sind.

  Dim sql As String

        sql = "SELECT tblRezepte.ID FROM tblRezepte INNER JOIN tblZutaten ON tblRezepte.ID = tblZutaten.RezeptID " & _
"WHERE Zutat "
        If Zutaten.Count = 0 Then Throw New Exception("Es müssen Suchparameter angegeben werden.")

        For i As Integer = 0 To Zutaten.Count - 1
            Dim wc As String = Zutaten(i).Wildcard.ToString
            wc = Replace(wc, "Enthält", "LIKE '*%string%*'")
            wc = Replace(wc, "IstGleich", "'%string%'")
            wc = Replace(wc, "BeginntMit", "LIKE '*%string%'")
            wc = Replace(wc, "EndetMit", "LIKE '%string%*'")

            If i = Zutaten.Count - 1 Then
                sql += "NOT " & Replace(wc, "%string%", Zutaten(i).Suchstring)
            Else
                sql += "NOT " & Replace(wc, "%string%", Zutaten(i).Suchstring) & Replace(Zutaten(i).Verknüpfungsoperator.ToString, "_", " ") & " Zutat "
            End If
        Next

        Dim getids As New myDB(sql, 0) 'DB Afragen

        Dim rList As New List(Of Integer)
        For Each item As String In getids.DatenArray("ID")
            rList.Add(Convert.ToInt32(item))
        Next


Schöne Grüße
Sascha

[Anhang gelöscht durch Administrator]

Diese Ausstrahlung! Dieses Lächeln! Diese Intelligenz!
Diese Wunderschönen Augen! Aber genug von mir. Wie geht's Dir?

bahasu

Hallo

vielleicht setzt der Anhang das um, was Du brauchst.

Gibt zwei Abfragen.
Eine mit der Zutat und eine ohne die Zutat.

Sorry, aber für Normalisierung hatte ich keine Lust.

Harald

[Anhang gelöscht durch Administrator]
Servus

DF6GL

Hallo,



sql = "SELECT tblRezepte.ID FROM tblRezepte INNER JOIN tblZutaten ON tblRezepte.ID = tblZutaten.RezeptID " & _
"WHERE Zutat  not in ('Mehl','Zucker','Salz')"

sollte das leisten...

NoFear23m

Hallo Franz

Das wäre natürlich super genial einfach aber.....
ICh bekomme trotzdem die ID`s von allen Rezepten.

z.b. HAbe ich in Zutaten bei der RezepteID 8 insgesamt 9 Zutaten. Eine davon ist Zucker. Wenn ich nun in der Abfrage Zucker rausfiltern lasse bekomme ich im Abfrageergebniss die ID 8 zwar korrekter weise nur noch 8 mal statt 9 mal. Aber ich will Sie ja NIE haben. Auch mit DISTINGT gehts leider nicht.

Das von behasu ist ja eigedlich gold richtig.
Hier wird hald in der Abfrage eine gespeicherte Abfrage mit eingebunden, ich muss leider komplette den SQL-String über Code zusammensetzen.
Wie würdet Ihr das machen?

Schöne Grüße
Sascha

Diese Ausstrahlung! Dieses Lächeln! Diese Intelligenz!
Diese Wunderschönen Augen! Aber genug von mir. Wie geht's Dir?

bahasu

Hi

der oben skizzierte Weg setzt zum einen die Abfrage MIT der Zutat aus (dafür ein sql-statement in vba zu schreiben sollte kein Problem sein)  und
zum zweiten die Verknüpfung der Rezept-Tabelle mit dieser Abfrage in der von im oben (Franz) aufgeführten Link beschriebenen Art (sollte auch kein Problem sein, das per vba in ein sql-statement zu überführen).

Also viel Spaß dabei

Harald
Servus

MzKlMu

#7
Hallo,
ZitatWie würdet Ihr das machen?

nur mal was mir auf die Schnelle so aufgefallen ist:

- Die Beziehung zwischen Rezept und Bewertung ist falsch rum. In die Rezepttabelle muss der Fremdschlüssel für die Bewertung.
Wenn die Bewertung ein fest vorgebener text ist, fehlt noch eine weitere Tabelle zur Zuordnung (n:m)

Kritischer ist aber:
- Es fehlt die reine Zutatentabelle oder die Zwischentabelle zwischen Rezept und Zutat.

- Das Gleiche gilt für das Equipment

Bevor das Datenmodell stimmt, solltest Du mit Abfragen zur Auswertung erst gar nicht anfangen.

Einen ähnlichen Hinweis gab es schon von NoFear23m:
ZitatSorry, aber für Normalisierung hatte ich keine Lust.
Gruß Klaus

bahasu

Zitat von: MzKlMu am April 02, 2011, 10:43:27
ZitatSorry, aber für Normalisierung hatte ich keine Lust.


Hi
Das Zitat stammt nicht von NoFear23m sondern von mir und bezog sich auf mein Beispiel, in dem ich auf die Schnelle ein Beispiel gestrickt hatte mit Details, die ich normalerweise normalisieren würde, was ich aber bei dieser Veranschaulichung zwecks Vereinfachung unterlassen hatte.

Harald
Servus

MzKlMu

Hallo,
@bahasu
sorry, habe ich auf die Schnelle den Namen verwechselt. Dacht auch Du meinst die Normalisierung des DB des TE.
Gruß Klaus

NoFear23m

Hallo Leute

@MzKlMu
Bin leider etwas aus der Übung und weis jetzt gerade nicht was du genau meinst.
Warum ist die Beziehung bei Bewertung falsch. Es können X Bewertungen abgeben werden. Die Berechnung welche Bewertung (Zahl) dort reinkommt erfolgt allerdings woanders.
Ist etwas komplitziert. Die Bewertung wird errechnet.
Mit den Zutaten hast du natürlich völlig recht...
Die DB ist auch nur ein Backend. Das Frontend ist ein ASP.Net Webservice.

ICh danke euch für die Beispiele von DonKarl und auch von bahasu. Leider bis ich eingerostet und weis nicht ganz wie ich den SQL am besten zusammensetzen kann damit ich das richtige ergebniss bekomme.

Wäre es denn einfacher wenn ich nicht über die Tabelle Rezepte gehen würde? Mir würde die RezeptID völlig reichen, welche ja auch in der Tabelle Zutaten vorhanden ist.
Vieleicht kann mir ja nochmal jemand einen kleinen Schubs geben...

Danke im Voraus und schöne GRüße
Sascha

Diese Ausstrahlung! Dieses Lächeln! Diese Intelligenz!
Diese Wunderschönen Augen! Aber genug von mir. Wie geht's Dir?

DF6GL

Hallo Sascha,

unabhängig von den Beziehungen/Normalisierungen erhältst Du alle RezeptID aus tblZutaten , die keine der angebeben Zutaten(namen) enthalten:

sql = "SELECT tblZutaten.RezeptID  from tblZutaten " & _
"WHERE Zutat  not in ('Mehl','Zucker','Salz')"

Wenn dann die ID jeweils immer nur einmal vorkommen soll:

sql = "SELECT Distinct tblZutaten.RezeptID  from tblZutaten " & _
"WHERE Zutat  not in ('Mehl','Zucker','Salz')"


oder auch:

sql = "SELECT  tblZutaten.RezeptID  from tblZutaten " & _
"WHERE Zutat  not in ('Mehl','Zucker','Salz') Group by  tblZutaten.RezeptID  "



Wie Du den String jetzt syntaktisch im  Code zusammenbauen mußt  (den Einbau der konkreten Kriteriumsliste), mußt Du selbst wissen.




database

#12
Hi,

Schubs in Anlehnung an Vorschlag von Franz in #4:


SELECT tblRezepte.ID FROM tblRezepte
WHERE tblRezepte.ID Not In (SELECT tblZutaten.ID FROM tblZutaten WHERE tblZutaten.Zutat='Zucker');


Liefert z.B alle Rezept-IDs in denen keine Zutat namens Zucker enthalten ist.

HTH

EDIT:

Schubs in Anlehnung an Vorschlag von Franz in #4 UND #11


SELECT tblRezepte.ID FROM tblRezepte
WHERE tblRezepte.ID Not In (SELECT tblZutaten.ID FROM tblZutaten WHERE tblZutaten.Zutat IN ('Zucker','Pfeffer'));

... liefert dann jene Rezept-ID wo weder Zucker noch Pfeffer vorkommt.
Hmmmm... der Franz war ein wenig schneller...  ;) ;D

NoFear23m

Hallo LEute

ICh weis eure Hilfe echt zu schätzen. Wirklich

Aber.... das stimmt so nicht.

z.b. habe ich die RezeptID 4 genau 9 mal in der Tabelle Zutaten. Es gibt für das Rezept also 9 Zutaten. Wenn ich alle Rezepte filtere die "Zucker enthalten filtert er mit bei RezeptID 4 auch einen raus so dass ich nur noch 8 habe. aber ich habe die ID immer noch drinnen. Auch mit Distinct.

Anbei ein Screenshot.

ICh möchte ja nur die RezeptID´s bekommen wo eine Zutat nicht vorhanden ist. Wenn bei einem Rezept Zucker vorhanden ist aber auch noch Oliven und anderes will ich dieses Rezept auch NICHT haben.

Grüße
Sascha

[Anhang gelöscht durch Administrator]

Diese Ausstrahlung! Dieses Lächeln! Diese Intelligenz!
Diese Wunderschönen Augen! Aber genug von mir. Wie geht's Dir?

database

#14
Hmmm..

Also du möchtest jene RezeptIDs haben, in denen KEINE Zutat enthalten ist, die 'Zucker' heißt.

Mit dieser SQL erhalte ich z.B. die entsprechende Rezept-ID NICHT angezeigt.


SELECT tblRezepte.ID FROM tblRezepte
WHERE tblRezepte.ID Not In (SELECT tblZutaten.ID FROM tblZutaten WHERE tblZutaten.Zutat='Zucker');



Entweder lese ich an deiner Anforderung vorbei oder ....  ?

Beispiel von bahasu geändert im Anhang

[Anhang gelöscht durch Administrator]