[MySQL]Najbardziej optymalne stawianie warunków w zapytaniu

0

Chcę wybrać z bazy rekord najlepiej pasujący do danych wymagań, ale w razie gdyby nie było aktualnie dostępnych takich rekordów, chcę najbardziej podobny do stawianych wymogów.

Przykładowo jeśli chciałbym wyjąć z bazy kształt, który jest kwadratem i jest zielony:
1)jesli jest dostępny dostanę kształt, który jest kwadratem i jest zielony,
2)jeśli nie jest dostepny dostanę kszatałt który jest kwadratem ale nie jest zielony
3)jeśli kształt, który jest kwadratem nie jest dostępny, zadowolę się dowolnym kształtem

W najlpeszym wypadku:

SELECT * FROM tabela WHERE a='a', b='b', c='c' LIMIT 1

W najgorszym wypadku:

SELECT * FROM tabela WHERE a='a' LIMIT 1

Oczywiście wiem, że mogę to zrobić w PHP, po kolei sprawdzając wszystkie warunki poprzez dokonywanie kolejnych zapytań, jednak owych warunków mam bardzo dużo i chciałbym Was prosić o zasugerowanie bardziej optymalnego rozwiązania, najlepiej w jednym zapytaniu SQL.

0

Mozesz wprowadzić coś na zasadzie scoringu, w ktorym punkty będą dodawane w przypadku spelnienia warunku:

select * from (
select id, ((case when atrybut1=wartosci1 then 1 else 0 end) + (case when atrybut2=wartosc2 then 1 else 0 end)) as score ) a scored_results order by score desc

pomogło?

0

Nie do końca rozumiem jak miałoby to wyglądać. Mógłbyś podać trochę więcej informacji?

0
select * from 
(
  select id, 
  (
    -- do ponizszych linii dopisujesz to co ci potrzebne
    (case when ksztalt='kwadrat' then 1 else 0 end)  -- 1 jesli jest kwadratem
    +(case when kolor='zielony' then 1 else 0 end) -- 1 jesli jest zielony
    +(case when zapach='smrod' then 1 else 0 end) -- 1 jesli smierdzi
  ) as score 
  from tabelka
) scored_results order by score desc

jak widzisz każdy z casow zwraca 1 jeśli warunek jest prawdziwy. Jeśli je dodasz otrzymasz punktacje - im wiecej punktow tym wynik bardziej podobny do tego co chciales. To się nazywa scoring - przyznawanie punktów w przypadku spełnienia warunków.

zapewne nie jest to optymalne rozwiazanie gdy w tabelce masz bardzo duzo rekordow ponieważ za każdym zapytaniem punkty wyliczane są na nowo dla każdego rekordu.

0

Używanie tego stwierdzenia chyba powinno zostać uznane za jednostkę chorobową i podlegać przymusowemu leczeniu. A najlepiej sterylizacji.

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