Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jeśli brak rezultatów, to drugie zapytanie
trzczy
post 10.10.2015, 13:19:37
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ę
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Crozin
post 10.10.2015, 13:26:34
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.
Go to the top of the page
+Quote Post
trueblue
post 10.10.2015, 13:38:07
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:
  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.

Ten post edytował trueblue 10.10.2015, 13:38:50


--------------------
Go to the top of the page
+Quote Post
Crozin
post 10.10.2015, 13:56:00
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. ;-)
Go to the top of the page
+Quote Post
trueblue
post 10.10.2015, 14:32:12
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Crozin,
TRUE


--------------------
Go to the top of the page
+Quote Post
trzczy
post 10.10.2015, 15:05:58
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?
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?
Go to the top of the page
+Quote Post
trueblue
post 10.10.2015, 16:15:50
Post #7





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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).


--------------------
Go to the top of the page
+Quote Post
trzczy
post 14.10.2015, 21:39:35
Post #8





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


Dziękuję za wyjaśnienie zagadnienia :-)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 12:11