![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 88 Pomógł: 4 Dołączył: 16.08.2006 Ostrzeżenie: (20%) ![]() ![]() |
Witam
Mam mały problem z wyciąganiem danych na podstawie dwóch innych tabel dokładnie chodzi mi o to że musze z tabeli 'uzytkownicy' wyciagnac userow na podstawie ilosci dodanych komentarzy i ocen gdzie komentarze i oceny są w osobnych tabelach. Zarówno w tabeli komentarzy i ocen jest jedno pole które określa kto napisał ten komentarz czy kto dodał ta ocenę. Udaje mi się wyciągać te dane ale tylko na podstawie jednej tabeli (może pokaże przykład):
Teraz jak to przerobić aby wyciągnąć jeszcze ilość ocen i posortować wg. ilosc_komentarzy+ilosc_ocen |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 781 Pomógł: 256 Dołączył: 29.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Cos w ten desen. Powinno dzialac tylko nazwy kolumn poprawn.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 88 Pomógł: 4 Dołączył: 16.08.2006 Ostrzeżenie: (20%) ![]() ![]() |
Nie chce ten sposób działać. Najpierw woła że dane musza być pgrupwoane więc daje GROUP BY u.user_name po czym wychodzi: #1242 - Subquery returns more than 1 row
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 83 Pomógł: 7 Dołączył: 3.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
spróbuj tak:
[edit] jesli natomiast chcesz sortować osobno wg ocen i komentarzy to by wyglądało chyba tak:
..dobrze by było żebyś podał strukturę tabel bo tak to nie wiem jakie nazwy kolumn dać w tych zapytaniach. Ten post edytował WiruSSS 22.02.2009, 15:52:23 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 88 Pomógł: 4 Dołączył: 16.08.2006 Ostrzeżenie: (20%) ![]() ![]() |
Twój przykład też nie chce działać. W przypadku gdy ktoś ma i ocenę i komentarz to w obu wartościach wyświetla to samo.
Nazwy tabel stosujesz dobre, to znaczy jedną rzecz sobie poprawiłem (nie ma user_id w tabelach komentarzy i ocen tylko jest komentarz_name i ocena_name które okreslaja kto napisał/dodał ocenę). Wychodzi tak jakby nie mogły być dwa LEFT JOIN bo nawet gdy zostaiwe jedno count a nadal będą dwa LEFT JOIN to wyświetla złe wartości dopiero jak zostawie jedno LEFT JOIN i jeden COUNT co zlicza to jest dobrze ale wtedy mam liczbę tylko jednych rzeczy. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 83 Pomógł: 7 Dołączył: 3.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
..podaj strukturę tabel ..to napewno jest dobrze tylko źle będą nazwy kolumn
..właśnie sobiw przetestowłem takie zapytanie na jednej z moich baz ..wybrałem za jego pomocą userów i posortowałem i ch wg odpowiednio pierw komentarzy dla newsów i potem komentarzy dla artykułów ...zapytanei działa na 100% ..ale niestety nie jest zbyt wydajne przy dużej liczbie rekordów, u mnie jest ponad 150000 rekordów w tabeli z userami i niestety nawet limit nie pomaga gdyż wpierw mysql musi dla każdego usera policzyć wszystkeikomenty potem posortować i na koniec dopiero obcina ..zaraz spróbuje do tego podejśc z innej strony (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Ten post edytował WiruSSS 22.02.2009, 17:12:25 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 88 Pomógł: 4 Dołączył: 16.08.2006 Ostrzeżenie: (20%) ![]() ![]() |
Struktura komentarzy:
Gdzie comment_name określa kto napisał komentarz. Oraz struktura ocen:
Tutaj rating_user określa kto coś ocenił. No i moje zapytanie wygląda tak:
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 83 Pomógł: 7 Dołączył: 3.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
..z teg oco widze problemem jest pole comment_name, które powinno zawierać id usera a zawiera chyba jego nick ..sądząc po typie komórki. Więc obecnie rozwiązaniem jest porównanie comment_name z u.username a nei z u.user_id ...jednak zalecałbym stworzyć pole które będzie zawierało id usera i porównywać po tym polu.
Ten post edytował WiruSSS 22.02.2009, 18:59:53 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 781 Pomógł: 256 Dołączył: 29.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Powinno dzialac na 100%
A tak po za tym to tabele chyba z Fusiona pochodzą (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Co do zapytania sprawdziłem i działa na 100% Ten post edytował kefirek 22.02.2009, 19:12:18 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 88 Pomógł: 4 Dołączył: 16.08.2006 Ostrzeżenie: (20%) ![]() ![]() |
comment_name zawiera id usera nie jego nick. To że jest typu VARCHAR to jest błąd.
Ok, kefirek działa ten twój sposób. Ten post edytował proton 22.02.2009, 19:13:15 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 83 Pomógł: 7 Dołączył: 3.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
a takie zagnieżdżanie zapytan nie powoduje jezscze większego spadku wydajności ? ...od wczoraj borykam się z jednym zapytaniem i wklejenie podzapytania powoduje że wydajnośc tego zapytania spada z ~0.05s na ...bagatela ~7.5s ?
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 781 Pomógł: 256 Dołączył: 29.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Można też tak sprawdzałem i działa
Ten post edytował kefirek 22.02.2009, 19:26:56 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 88 Pomógł: 4 Dołączył: 16.08.2006 Ostrzeżenie: (20%) ![]() ![]() |
Można też tak sprawdzałem i działa
To zapytanie działa źle bo sprawdzałem to na małych liczbach i widziałem błąd. Przy pierwszej osobie pobiera znacznie większą liczbę a do tego jeśli ktoś i skomentował i ocenił coś to w obu wartościach (komentarzy i ocen) pokazywało tą samą liczbę. Sposób który działa też jest nie najwydajnieszy bo widziałem, jednak będe planował aby ranking z tymi wartościami aktualizował się co 24h (co moim zdaniem nie będzie tak obciążało bazy danych - chyba że się mylę). Do tego mam takie małe pytanie jeśli dodam jeszcze warunek WHERE 'cos=innego' to czy baza najpierw sprawdza rekordy pod względem tego warunku i dopiero potem oblicza te ilości (komentarze i oceny) czy oblicza wartości dla wszystkich i dopiero potem odrzuca te rekordy które nie spełniają warunku. Bo po czasie wykonania widziałem że wykonuje sie szybciej. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 83 Pomógł: 7 Dołączył: 3.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
...WHERE jest w pierwszej kolejności ...co dozapytania ...jest napewno dobrze ..bo sprawdzałem jes na analogicznej sytuacji (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ..jednak jest ono mało wydajne przy dużej ilości rekordów w tebeli którą wybieramy za pomocą FROM
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 11:13 |