![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 167 Pomógł: 0 Dołączył: 30.04.2004 Skąd: Częstochowa Ostrzeżenie: (0%) ![]() ![]() |
Witam
Mam problem, nie bardzo wiem jak go rozwiązać. Mam w bazie użytkowników. Każdy użytkownik powiedzmy że może określić 10 cech - każda z cech ma do 50 opcji np. 1,2,3,4, ... 50. Chciałbym móc wyświetlić użytkowników, którzy mają jak najwięcej takich cech jak ja, najpierw tych którzy mają 10 identycznych, potem 9, potem 8 itd. Pytanie czy da się jakoś sensownie to przechować w tabeli żeby móc sortować w locie w mysqlu tabele czy może trzeba coś bardziej skomplikowanego wymyślić? Macie jakiś pomysł na rozwiązanie tego problemu? Pozdrawiam -------------------- |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 39 Dołączył: 7.11.2010 Skąd: Raz tu, raz tam Ostrzeżenie: (30%) ![]() ![]() |
wyswietlasz to normalnym zapytaniem tylko na koncu dodajesz
nie wiem czy o to codzilo:P -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 167 Pomógł: 0 Dołączył: 30.04.2004 Skąd: Częstochowa Ostrzeżenie: (0%) ![]() ![]() |
Rzecz w tym, że pól w tabeli będzie przykładowo 10 które mają być porównane np. zainteresowanie, rodzina itd. i chodzi o sortowanie od tych, których wartość pól odpowiada naszym jak najbardziej (max 10/10) do tych najmniej (0/10)
-------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
niestety nie znamy struktury danych...
poczytaj o ilorazie zbiorów - gdyż to mi tu najbardziej pasuje - a raczej tego prostsza wersja - jak na szybko sprawdziłem w firefoxie na sqlite to poniższe zadziałąło - gdzie nie ma wypełnionych liczbami tabel i przyjete jest, że moga wystąpić powtórzenia - jeśli ich nie będzie nie potrzebny distinct... nie myślałem nad rozwiązaniem bez grupowania:
gdzie jak iloraz sprawdzałem zapytanie typu (SELECT l FROM liczba WHERE l>=2) z tabeli liczba potraktowałem jako "wirtualną tabele" [gdzie w danej grupie zgodnie z ilorazem muszą się zawrzeć wszystkie liczby|wartości danego zbioru] a na Twoje rozwiązanie algorytm ilorazu pasuje pominąć HAVING i dać ORDER BY dopasowan_unikalnych [lub dopasowan_wszystkich jeśli masz unikalne rekordy w danej grupie] - nie wiem na ile pomogłem ale poczytaj o ilorazie zbiorów sql czy jak tam zwał - jakoś w polskim google tak na szybko nie wiele o tym znalazłem... ps. to o czym wspominam chyba się nazywa dokładniej "dzieleniem relacyjnym" Ten post edytował zegarek84 9.11.2010, 01:27:18 -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 167 Pomógł: 0 Dołączył: 30.04.2004 Skąd: Częstochowa Ostrzeżenie: (0%) ![]() ![]() |
Powiem szczerze, ze szukałem co nieco, ale nie znalazłem nic ciekawego. Nie wiem poza tym, czy się dobrze zrozumieliśmy, więc teraz wrzucam przykładowy schemat bazy danych
Chciałbym wyświetlić te rekordy, które pola answer_1 ... answer_8 mają jak najbardziej zbliżone do rekordu o danym a_id_user. Patrząc na dane jeśli szukamy rekordów "podobnych" do rekordu użytkownika 1, to użytkownik 2 ma tylko 1 pole podobne (answer_1), użytkownik 3 ma 4 pola podobne (answer_1, answer_3,answer_7,answer_8), użytkownik 4 ma 2 pola podobne (answer_7,answer_8), użytkownik 5 ma 5 pól podobnych (answer_1,answer_5,answer_6,answer_7,answer_8), to chciałbym w rezultacie otrzymać rekordy z danymi (dopasowanie, a_id_user) posortowane względem dopasowania malejąco, czyli w tym przypadku: 5 5 4 3 2 4 1 2 Pytanie - czy jest to wykonalne? Schemat bazy może zostać dowolnie zmieniony, ale powinien zakładać spore obciążenie - w tej przykładowej tabeli rekordów docelowo może być kilkadziesiąt tysięcy -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 23 Pomógł: 2 Dołączył: 7.10.2010 Ostrzeżenie: (0%) ![]() ![]() |
Skorzystaj z funkcji agregujących języka SQL, a dokładnie z COUNT, dodatkowo jeśli chcesz żeby dane były posortowane wystarczy skorzystać z funkcji sortujących.
Ten post edytował masters1987 1.03.2011, 07:58:58 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Jak już to przeprojektuj tabele na taką strukture
Kod id_user, nr_answer, answer, weight A wtedy wyszukujesz tak
Indeksy: INDEX (nr_answer, answer, id_user) Powinno styknąć. -------------------- |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 167 Pomógł: 0 Dołączył: 30.04.2004 Skąd: Częstochowa Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wookieb - to chyba rzeczywiście załatwi sprawę.
-------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 18:08 |