Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jeśli brak rezultatów, to drugie zapytanie
Forum PHP.pl > Forum > Bazy danych > MySQL
trzczy
Jak powinno brzmieć zapytanie, które w przypadku braku rezultatów z pierwszego zapytania podrzędnego pyta drugi raz za pomocą drugiego zapytania podrzędnego?

Czyli działa np. tak:

Jeżeli zapytanie
SELECT * FROM my_table WHERE my_col = 1 AND my_col_b = 2
nie zwróci żadnego rekordu, to będzie drugie zapytanie, o następującej treści
SELECT * FROM my_table WHERE my_col = 1

A więc chodzi o to, aby "troszkę" poszerzyć zakres wyszukiwania, czyli złagodzić warunek, kiedy się nic nie znalazło. Jeśli można prosić, to podajcie rozwiązanie z dokładną składnią.
Z góry dziękuję
Crozin
Masz wiele możliwości.
1. Połącz oba zapytania UNION-em.
2. Wykonaj tylko drugie zapytanie, ale dodaj sobie sortowanie by rekordy z my_col_b = 2 były w pierwszej kolejności.
3. Po prostu po stronie PHP czy czegokolwiek używasz sprawdź ile jest wyników i ew. wykonaj drugie zapytanie.
trueblue
Jeśli chcesz otrzymać jeden rekord spełniający priorytetowo pierwszy warunek, potem drugi, to można też tak:
  1. SELECT * FROM my_table WHERE my_col=1 ORDER BY IF(my_col_b=2,1,0) DESC LIMIT 0,1


EDIT. Teraz widzę, że to rozwiązanie cool.gif zaproponowane przez Crozin.
Crozin
@trueblue: Tak swoją drogą to nieco ładniejszym zapisem byłoby ORDER BY my_col = 2 DESC - nie ma specjalnie potrzeby dla funkcji IF. ;-)
trueblue
Crozin,
TRUE
trzczy
O coś takiego chodzi. Bo rekordy spełniające ten bardziej wymagający warunek posiadają pewne dane podstawowe, ale też dodatkowe dane specjalne. A rekordy spełniające tylko ten słabszy warunek mają mają tylko dane podstawowe.

Problem polegał na tym, że przy szczegółowym warunku, tym z 'and', można było nie otrzymać tych danych podstawowych, gdy w bazie nie było rekordu spełniającego szczegółowy warunek. A przy zapytaniu tym ogólniejszym znajdywały się rekordy, które nie miały danych specjalnych, miały dane specjalne, ale niekoniecznie te właściwe dane specjalne, oraz ewentualnie unikalny rekord z właściwymi danymi specjalnymi. I ten unikalny rekord z właściwymi danymi specjalnymi, jeśli był, to nie był możliwy do uchwycenia w sensie odfiltrowania.

Jeszcze mam pytanie: rozumiem, że stosowanie tutaj klauzuli if jest niekonieczne, ale jeśli się by ją zastosowało, to co ona robi?
Cytat(trueblue @ 10.10.2015, 14:38:07 ) *
  1. ORDER BY IF(my_col_b=2,1,0) DESC

Rekordy spełniające warunek są wybierane jako pierwsze, na co wskazuje liczba 1, a niespełniające tego warunku są wybierane w drugiej kolejności?
trueblue
Cytat(trzczy @ 10.10.2015, 16:05:58 ) *
Jeszcze mam pytanie: rozumiem, że stosowanie tutaj klauzuli if jest niekonieczne, ale jeśli się by ją zastosowało, to co ona robi?

Rekordy spełniające warunek są wybierane jako pierwsze, na co wskazuje liczba 1, a niespełniające tego warunku są wybierane w drugiej kolejności?

Tak.
Ale jako pierwsze są wybierane dzięki temu, że jest sortowanie malejące, a nie dzięki warunkowi.
If jest niepotrzebne, bo bez niego sytuacja będzie identyczna (True=1,False=0).
trzczy
Dziękuję za wyjaśnienie zagadnienia :-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.