![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 11.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Mam do zrealizowania zadanie polegające na odpowiednim porządkowaniu wyników wyszukiwania po podanej frazie w sklepie internetowym. Początkowy wymóg był taki aby po wpisaniu frazy (dajmy na to) 'xt' na początku pojawiały się produkty, w których 'xt' funkcjonuje jako osobne 'słowo', w następnej kolejności mają się pojawiać wpisy gdzie 'xt' jest częścią słowa np. w słowie 'next', potem produkty gdzie w opisie znalazło się 'xt'. Kwestia została rozwiązana po przez wykorzystanie dwóch UNION łączących 3 zapytania, wyniki ze słowem 'xt' lądowały na początku (grupa 1), potem tam gdzie 'xt' było zawarte w słowie (grupa 2), na końcu tam gdzie znalazło się w opisach (grupa 3). Zapytanie dla grupy 1 szuka uzywajac LIKE '% xt %', zapytanie dla grupy 2 LIKE '%xt%' oba po nazwie produktu, przy takiej konstrukcji wyniki z pierwszego zapytania zawierają się w wynikach z drugiego zapytania, tutaj przed powtarzaniem wyników chroni nas UNION (które domyślnie działa jako DISTINCT), kolejność zapytań zapewnia odpowiednia kolejność wyników. Problem pojawił się gdy zostało ustalone aby wyniki w tych grupach były sortowane wedle tego czy produkt jest "ważny" czy nie (wartość 0 lub 1). Zastosowałem w każdym z 3 zapytań zwykłe "ORDER BY important DESC", jednak po otrzymaniu wyników okazało się, że w grupach 1 i 2 oczekiwane sortowanie nie nastąpiło Pytanie jest takie czy jest to wada UNION czy też moje błędne podejście do tematu i ewentualnie czy można to zrealizować za pomocą jednego zapytania omijając programistyczne (php) przetwarzanie wyników ? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
No więc jeśli napiszesz takie zapytanie:
to wiersze z tekstem " xt " i `important` równym 1 będą miały dodatkową kolumnę z wartością 7. Te z `important` = 0 będą miały 6 w kolejnym zapytaniu: wiersze z tekstem " xtra" będą miały wartości 5 lub 4 w zależności od pola `important`. Oznacza to, że: 1. Wiersze z tekstem " xt " zawsze będą miały większą wartość `col_order` niż wiersze z tekstem " xtra" 2. Wiersze z tekstem pasującym do tego samego LIKE będą miały większą wartość w `col_order`, jeśli będą ważne (`important` = 1) Więc nasza sztucznie utworzona kolumna `col_order` idealnie nadaje się do sortowania:
Jedyny problem z tym zapytaniem jest taki, że ten sam wiersz może zostać dopasowany wiele razy, a UNION go nie odsieje, bo będzie miał różne wartości w `col_order`. Dlatego trzeba całe to zapytanie umieścić w środku SELECTa, który pobierze wszystkie kolumny oprócz `col_order` + zastosowanie DISTINCT Jeśli to nie da dobrych rezultatów, to już nie mam pomysłów i może faktycznie pozostanie metoda programistyczna Ten post edytował Noidea 7.02.2011, 16:12:50 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 10.10.2025 - 07:17 |