![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 208 Pomógł: 3 Dołączył: 13.07.2009 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
Witam,
szukam dobrego rozwiązania które pozwoliłoby mi na wyszukiwanie przepisów po podanych składnikach. Ważne aby pokazywało tylko te przepisy które nie mają innych składników niż te które wprowadziłem w inpucie. Struktura bazy danych: (Tabela: kolumna1,...) przepisy: id, nazwa przepisy_skladniki: ps_id, ps_przepis, ps_skladnik Na chwilę obecną zdołałem napisać następujące zapytania:
Problem: Pokazuje przepisy które zawierają wymienione składniaki (15 i 99 to id składników o które zapytałem)
Problem: Pokazuje ten przepis który ma te składniki ale i inne, a nie ten który ma tylko te wyniki. Co robię nie tak? Count(*) > 2? Też nie działa poprawnie. Bardzo proszę o pomysł, pomoc lub rozwiązanie za które po stokroć dziękuję już teraz! |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Albo coś takiego:
http://stackoverflow.com/a/7505147/3732803 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Pyton_000,
to zapytanie zwróci przepisy, które zawierają również składniki spoza wybranych. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Nie powinno chyba że zdefiniuje warunek HAVING >= X
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Nie powinno, ale zwróci:)
Spięcie tabel jest po id_przepis, więc jeśli przepis ma 5 składników, ale 2 z nich wybrane, to i tak zostanie wyselekcjonowany do puli wyników. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
trueblue
Twoje zapytanie rónież zwróci źle. Zakładając, że najważniejsze jest:
to dla ps.id_skladnik ={1,2,3,4} również zwróci 2 (IMG:style_emoticons/default/smile.gif) dla ps.id_skladnik = {1,1} także zwróci 2 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
trueblue Twoje zapytanie rónież zwróci źle. Zakładając, że najważniejsze jest:
to dla ps.id_skladnik ={1,2,3,4} również zwróci 2 (IMG:style_emoticons/default/smile.gif) dla ps.id_skladnik = {1,1} także zwróci 2 mmmmmmm, Dla pierwszego przykładu zwróci 0 (+1,+1,-1,-1) Dla drugiego, tak, masz rację. Choć wiadomo jakie powinno być założenie co do tabeli. Ten post edytował trueblue 3.09.2015, 12:09:42 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 208 Pomógł: 3 Dołączył: 13.07.2009 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
trueblue nie wiem czy to moja wina przepisania czy zrozumienia, ale zapytanie:
wyrzuca wynik w phpmyadmin: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))=2 LIMIT 0, 30' at line 5 Poza tym zastanawiam się, jeśli chciałbym podawać mniej lub więcej niż dwa składniki (np. w przedziale od 1 do 20) to jak powinienem do tego podjeść? Czy może to wyglądać w ten sposób:
Czy jestem na dobrym tropie? Czy nadal głęboko w lesie :-/// Ten post edytował d0m1n1k_ 3.09.2015, 14:15:51 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
IF nie ID Tyle ile id składników, takie porównanie z ilością. Dla 4-ech byłoby:
Pamiętaj aby w tabeli przepisy_skladniki nie mieć przypisanego kilkukrotnie tego samego składnika do przepisu (powinien być indeks unikalny na dwóch polach). |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 208 Pomógł: 3 Dołączył: 13.07.2009 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
Z tym ID/IF to mój błąd przy wprowadzaniu zapytania na forum.
W phpMyAdmin było poprawnie (IF) i błąd wystąpił przy IF'ie ten który opisałem w poprzednim poście. Czyli ostatnia linijka powinna wyglądać następująco?:
Dobrze to rozumiem? Co do mysql i unikalności, mam to wykonać w następujący sposób?:
POPRAWKA! Kod poprawiony: HAVING SUM(IF(ps.ps_id IN(1,2),1,-1))=2 Takie szczegóły ;-) Ale teraz wywala mi wynik zerowy dla zapytania 15,99 a powinno pokazać dwa przepisy :-/// Ten post edytował d0m1n1k_ 3.09.2015, 14:50:43 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Pokaż zapytanie dla id 15 i 99.
Indeks ok, jeśli te pola to id przepisu i składnika. Ten post edytował trueblue 3.09.2015, 14:53:15 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 208 Pomógł: 3 Dołączył: 13.07.2009 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
Na chwilę obecną sprawdzam statyczne zapytanie, bez zmiennych.
Przypomnę układ tabel: (Przepis) przepisy: id, nazwa (Składniki) przepisy_skladniki: ps_id, ps_przepis, ps_skladnik |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Pole ps_id w tabeli przepisy_skladniki nie jest potrzebne jeśli założyłeś indeks unikalny. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 208 Pomógł: 3 Dołączył: 13.07.2009 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
Przeanalizowałem.
Mały błąd już teraz działa (IMG:style_emoticons/default/smile.gif)
W ostatniej linijce zamiast ps.ps_id wykorzystałem ps.ps_skladnik Równo to zauważyliśmy ;-) Ale za tyle pomocy Piwo Ci się należy! I po trój kroć klik pomógł! Ale teeeeraz. Jak już sprawę podstawową mam załatwioną, to teraz zastanawiam się nad rozwinięciem. Jak mógłbym zmodyfikować kod aby pokazywał mi przepisy które mają jeden lub dwa składniki więcej, sortowane po tej wartości od 1 do 10 składników dodatkowych. Ten post edytował d0m1n1k_ 3.09.2015, 15:03:33 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Zerknij, jeśli działa, to być może da się uprościć:
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 208 Pomógł: 3 Dołączył: 13.07.2009 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
Niestety nie działa.
Error: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS ilosc_podstawowa,SUM(IF(ps.ps_skladnik NOT IN(15, 99),1,-1))) AS ilosc_dodatk' at line 1 Zaś po zmianie nawiasów dls ilosc_podstawowa i ilosc_dodatkowa, aby były osobnymi wartościami wywala mi pusty wynik.
Głowię się nad tym od 2h i nie mogę tego ogarnąć :-// Jak usunę w HAVING "AND ilosc_dodatkowa>=5" pokazuje elementy które spełniają warunek podstawowy (przepisy w których są tylko wymienione składniki), zaś ilosc_dodatkowa w obu przypadkach wynosi -2 Gdy usunę cały zwrot HAVING otrzymuję wszystkie przepisy, ułożone od spełniających do niespełniających. Tabela przepisy_skladniki ma następujące wpisy:
Wynik po całkowitym usunięciu klauzury HAVING jest następujący:
Ten post edytował d0m1n1k_ 3.09.2015, 19:21:05 |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 208 Pomógł: 3 Dołączył: 13.07.2009 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
Trochę przekombinowałem, ale
po zmianie zapytania na następujące:
Uzyskałem wynik już bardzo satysfakcjonujący:
ilosc_dodatkowa<=3 zmniejszyłem, aby wyeliminowało mi jakikolwiek przepis ;-) Zastanawiam się jeszcze nad zmianą klauzury:
na
bo obecny efekt jest identyczny ale nie wiem czy jest to dobre rozwiązanie. |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Wynik jest identyczny, ale to akurat przypadek.
Nie zawsze tak musi być. Jeśli będziesz mieć przepis z czterema wybranymi składnikami i trzema innymi dodatkowymi, to przepis będzie spełniał tylko jeden z tych warunków (ten krótszy). |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 21:25 |