Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: NoFear23m am April 02, 2011, 09:44:45

Titel: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: NoFear23m am April 02, 2011, 09:44:45
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


Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: DF6GL am April 02, 2011, 09:47:50
Hallo Sascha,

schau hier:

http://www.donkarl.com/?FAQ3.16
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: NoFear23m am April 02, 2011, 10:00:02
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]
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: bahasu am April 02, 2011, 10:11:18
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]
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: DF6GL am April 02, 2011, 10:16:04
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...
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: NoFear23m am April 02, 2011, 10:24:25
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
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: bahasu am April 02, 2011, 10:41:16
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
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: MzKlMu am April 02, 2011, 10:43:27
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.
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: bahasu am April 02, 2011, 11:31:03
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
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: MzKlMu am April 02, 2011, 11:35:59
Hallo,
@bahasu
sorry, habe ich auf die Schnelle den Namen verwechselt. Dacht auch Du meinst die Normalisierung des DB des TE.
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: NoFear23m am April 03, 2011, 09:45:29
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
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: DF6GL am April 03, 2011, 10:08:51
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.



Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: database am April 03, 2011, 10:12:58
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
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: NoFear23m am April 03, 2011, 10:25:21
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]
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: database am April 03, 2011, 10:34:43
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]
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: NoFear23m am April 03, 2011, 10:40:39
Hallo Database

Genau das wars!!

Vielen dank. Habe einfach schon zuuu lange nix mehr mit SQL gemacht.

HAbe nun diese Abfrage
SELECT tblRezepte.ID FROM tblRezepte
WHERE tblRezepte.ID Not In (SELECT tblZutaten.RezeptID FROM tblZutaten WHERE tblZutaten.Zutat LIKE'*Salz*');


Funzt einfach super. ICh bau das mal in den Code ein, damit man komfortabel Suchen kann.
Danke allen natürlich für Ihre Antworten, ich habt mir alle sehr geholfen. Schöne das sich an diesem Forum in der Zeit nix verändert hat. Immernoch so gut wie früher. *g*

Schöne Grüße aus Wien
Sascha
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: Accspert am April 13, 2021, 19:49:21
Hallo Forum
dies scheint ja schon ein älterer thread zu sein, aber scheinbar immer noch ungelöst. Ich habe eine sehr ähnliche Frage, habe diese auch schon sehr vielen "Experten" im Netz gestellt, keiner konnte es lösen. Im Anhang seht ihr 3 Tabellen. Rezepte, Zutaten, Produkte. Simple Frage aber doch schwer zu lösen. Wie muss das Query aussehen, das mit angibt welche Rezepte ich aufgrund von ausreichenden Zutaten kochen kann. Ich habe es mit 4 Queries geschafft. Nur eins wäre wirklich eine Meisterleistung.
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: ebs17 am April 13, 2021, 20:40:44
Zitataufgrund von ausreichenden Zutaten
... heißt hier QtyNeeded kleiner gleich OnHand für das Produkt?
SELECT
   I.RecipeID
FROM
   (
      SELECT
         I.RecipeID,
         COUNT(I.ProductID) AS CountP
      FROM
         IngredientT AS I
            INNER JOIN ProductT AS P
            ON I.ProductID = P.ProductID
      GROUP BY
         I.RecipeID
   ) AS A
      INNER JOIN
         (
            SELECT
               I.RecipeID,
               COUNT(I.ProductID) AS CountP
            FROM
               IngredientT AS I
                  INNER JOIN ProductT AS P
                  ON I.ProductID = P.ProductID
                     AND
                  I.QtyNeeded <= P.OnHand
            GROUP BY
               I.RecipeID
         ) AS B
         ON A.RecipeID = B.RecipeID
            AND
         A.CountP = B.CountP
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: Accspert am April 13, 2021, 21:14:58
ja richtig oder andersrum Produkte sind ausreichend, wenn OnHand (Im Lager) grösser oder gleich QtyNeeded (gebraucht) ist.

das sql sieht gewaltig aus. Muss man jetzt I. mit der Ingriedients tabelle ersetzen ?

Wahnsinn das funktioniert. Würde zu gerne wissen wie du das gemacht hast.
Titel: Re: Rezepte finden wo Zutat nicht vorhanden
Beitrag von: ebs17 am April 13, 2021, 22:01:51
Zitatwie du das gemacht hast
(1) Überlegen. Idee: Anzahl der Produkte pro Rezept gleich der Anzahl der Produkte, wo zusätzlich die Menge passt.
(2) Schreiben. Technik: Grundlagen - SQL ist leicht (6) - Komplexe Abfragen schreiben und lesen (https://www.ms-office-forum.net/forum/showthread.php?p=1633105#post1633105)