![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 460 Pomógł: 49 Dołączył: 5.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
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ę |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Jeśli chcesz otrzymać jeden rekord spełniający priorytetowo pierwszy warunek, potem drugi, to można też tak:
EDIT. Teraz widzę, że to rozwiązanie ![]() Ten post edytował trueblue 10.10.2015, 13:38:50 -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@trueblue: Tak swoją drogą to nieco ładniejszym zapisem byłoby ORDER BY my_col = 2 DESC - nie ma specjalnie potrzeby dla funkcji IF. ;-)
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Crozin,
TRUE -------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 460 Pomógł: 49 Dołączył: 5.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
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? 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? |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
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). -------------------- |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 460 Pomógł: 49 Dołączył: 5.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
Dziękuję za wyjaśnienie zagadnienia :-)
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 12:11 |