Sprawdzenie składników lodów

0

Witam, jak najoptymalniej zbudować bazę danych oraz zapytanie. Baza zawiera różne zestawienia lodów, np.

    ID NAZWA SKLADNIK1 SKLADNIK2 SKLADNIK3 SKLADNIK4
    1 qwe kiwi pomarańcz wiśnia czereśnia
    2 sss orzech_wloski czekolada
    3 eee pomarańcz czekolada mięta
    4 ttt mięta kiwi

Jak powinno wyglądać zapytanie jeśli chce wypisać wszystkie lody, w których znajduję się czekolada oraz mięta

0

Sprawdz czy ktorykolwiek ze skladnikow jest mieta

To tyle

5

Taka baza to jest idiotyczna i bez sensu. Zrób 3 tabele:

  • Składnik
  • Lód
  • Składniki loda, która przechowuje ID loda i ID składnika który w nim występuje.
0

@emil1702 a jak któryś lód będzie miał 5 składników??

0

Dobra zrobiłem bazę jak podpowiadacie. Dane jakich lodów poszukujemy wybiera użytkownik strony, nazwy wybranych składników znajdują się w [b]tablicy tab[][/b].

Jak ułożyć zapytanie, które pokaże nam lody wyłącznie z tymi wybranymi składnikami (bez żadnych innych, np. użytkownik wybrał czekolada, mięta, więc lód może zawierać jedynie czekolade i mięte),

a drugie zapytanie, które pokaże nam lody z wybranymi składnikami (ale dodatkowo mogą być także inne składniki, np. użytkownik wygrał czekolada, mięta, ale lód może zawierać także np. orzechy).

0

No ale co to jest? Mamy za ciebie zrobić całą pracę domową czy jak? Pokaż jakie zapytania próbowałeś do tych zadań napisać.

0
SELECT lod.nazwa, lodziarnia.miasto 
FROM `lod`, `lodziarnia`, `skladnik`, `kompozycja` 
WHERE lodziarnia.id = lod.id_lodziarnia AND 
skladnik.nazwa IN ('".implode("', '", $tab)."') AND 
kompozycja.id_skladnik = skladnik.id AND 
lod.id = kompozycja.id_lod

Po wybraniu mięta, wyświetla wszystkie lody, które zawierają mięte (oraz inne składniki), po wybraniu czekolada oraz mięta wyświetla lody, które zawierają mięte lub czekoladę, a musiałbym wyświetlać te, które zawierają miętę i czekoladę, lecz przez łącznik AND nie mogę tego zapytania ułożyć.

0

Nie widzę innego sposobu jak tylko przecinać zbiory lodów z konkretnym składnikiem. Tzn lody z miętą i czekoladą to będzie coś w stylu:

select lod.nazwa from lody where lod.id in
  (select lod.id from lody inner join kompozycja on blabla where kompozycja.skladnik_id = tab[0]) and
  (select lod.id from lody inner join kompozycja on blabla where kompozycja.skladnik_id = tab[1]) ...
0
SELECT lod.nazwa FROM lod WHERE lod.id IN
  (SELECT lod.id FROM lod INNER JOIN kompozycja ON lod.id = kompozycja.id_lod WHERE kompozycja.id_skladnik = 1) AND (SELECT lod.id FROM lod INNER JOIN kompozycja ON lod.id = kompozycja.id_lod WHERE kompozycja.id_skladnik = 2)

i błąd: **Subquery returns more than 1 row **, nie wiem czy możliwe jest korzystanie z więcej niż jednego podzapytania.

1

Aj głupi skrót zrobiłem :P Oczywiście where lod.id in (select...) and lod.id in (select...) itd

0

Najoptymalniej :P będzie tak: http://sqlfiddle.com/#!9/8db7b/4

1 użytkowników online, w tym zalogowanych: 0, gości: 1