Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Sortowanie po danych uzyskanych po złączeniu i grupowaniu, ciężko ten temat sensownie nazwać...
elektrrrus
post
Post #1





Grupa: Zarejestrowani
Postów: 175
Pomógł: 18
Dołączył: 11.06.2007
Skąd: Koszalin/Poznań

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


Witam,

Problem jest następujący:

próbuje dodać do komponentu remository joomli(seria przed 1.5) sortowanie plików po ocenie zamiast po id. Domyślnie jest możliwe sortowanie po id, nazwi, ilośc pobrań i dacie dodania. Z tym nie ma problemu, bo wszytskie te dane znajdują się w jednej tabli, order by i po sprawie. Natomiast spory problem rodzi się przy próbie sortowania po ocenie. Oceny sa w innej tabeli( jos_downloads_log) niż pliki (jos_downloads_files), w dodatku tabela ta nie zawiera tylko i wyłącze ocen, ale także inne, bliżej nieokreslone dla mnie dane. Oceny mają w tabeli jos_downloads_log i kolumnie type wartość 3, natomiast pole value okeśla wagę głosu, pole fileid id pliku do jakiego głos się odnosi.
Próbowałem to zrobić tak:
  1. SELECT *
  2. FROM jos_downloads_files LEFT JOIN jos_downloads_log ON jos_downloads_files.id = jos_downloads_log.fileid
  3. WHERE jos_downloads_files.containerid =5 AND published =1
  4. GROUP BY fileid
  5. ORDER BY IF( (jos_downloads_log.type = 3), AVG(jos_downloads_log.value), 0);


ale nie daje to czekiwanych rezultatów, zwraca tylko wyniki które mają (jos_downloads_log.type = 1.
Nie wiem, czy nie przekombinowałem z tym złączeniem, na początku był zamysł, aby pobierać wartość oceny jako jedno z pól i potem to sortować wg. tego, ale nic z tego.
Wydaje mi się, że zrobienie tego po stronie sql jest po prostu fizycznie niemozłiwe, swoją drogą cała bada danych tego ledwo się trzyma kupy, ale ma to być tylko rozwiązanie tymczasowe.

Czy istnieje jakiś sposób na sortowanie wg. podanego warunku?

Ten post edytował elektrrrus 27.10.2008, 20:31:18
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nevt
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


jest to jak najbardziej wykonalne w MySQL i niespecjalnie skomplikowane...
  1. SELECT `jdf`.*, AVG(`jdl`.`value`) AS `ocena`, `jdl`.`type` FROM `jos_downloads_files` AS `jdf` LEFT JOIN `jos_downloads_log` AS `jdl` ON `jdf`.`id` = `jdl`.`fileid` GROUP BY `fileid` HAVING `type`=3 ORDER BY `ocena`;
Go to the top of the page
+Quote Post
elektrrrus
post
Post #3





Grupa: Zarejestrowani
Postów: 175
Pomógł: 18
Dołączył: 11.06.2007
Skąd: Koszalin/Poznań

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


Dziękuje bardzo za pomoc, ale to nie daje oczekiwanych rezultatów.
Podane zapytanie zwraca mi tylko jeden rekord i mam dodatkowo problem przy takim zapytaniu w wybraniu rekródw o published = 1 i containerid = 5.
Próbowałem sam pokombinować z podanym zapytaniem, ale nic sensownego nie uzyskałem.
Go to the top of the page
+Quote Post
nevt
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


wnioski są proste... albo oceniony jest tylko jeden plik albo źle opisałeś strukturę danych... na moich tabelach o strukturze jak opisałeś zapytanie działa poprawnie...a korekta na dodatkowy warunek jest banalna, jaki problem?
  1. SELECT `jdf`.*, AVG(`jdl`.`value`) AS `ocena`, `jdl`.`type` FROM `jos_downloads_files` AS `jdf` LEFT JOIN `jos_downloads_log` AS `jdl` ON `jdf`.`id` = `jdl`.`fileid` GROUP BY `fileid` HAVING `type`=3 AND `jdf`.`containerid` = 5 AND `published` = 1 ORDER BY `ocena`;
Go to the top of the page
+Quote Post
elektrrrus
post
Post #5





Grupa: Zarejestrowani
Postów: 175
Pomógł: 18
Dołączył: 11.06.2007
Skąd: Koszalin/Poznań

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


Plików z oceną jest więcej, z tego co pobieżnie naliczyłem ok. 40.

Być może napisałem źle strukturę danych, spróbuje to wyjaśnić jeszcze raz.
Mam dwie tabele:
jos_downloads_files, który ma interesujące pola:
id, container, published

jos_downloads_log, zawierający:
fileid - odniesnie do pliku
type - jeśli ma wartośc 3 jest głosem na plik
vote - zawiera liczby od 1 do 5 będące oceną.

Problem: wyciągnięcie wszytskich danych z tableli jos_downloads_files, posortowanych po średniej z wszytskich ocen jaki ma plik, także pliki bez oceny maja być wyciągnięte.

Ten post edytował elektrrrus 27.10.2008, 22:04:05
Go to the top of the page
+Quote Post
nevt
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


Cytat
natomiast pole value okeśla wagę głosu

a teraz:
Cytat
vote - zawiera liczby od 1 do 5 będące oceną

wiesz już co trzeba poprawić? jeżeli nie, to pomogę (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
  1. SELECT `jdf`.*, AVG(`jdl`.`vote`) AS `ocena`, `jdl`.`type` FROM `jos_downloads_files` AS `jdf` LEFT JOIN `jos_downloads_log` AS `jdl` ON `jdf`.`id` = `jdl`.`fileid` GROUP BY `fileid` HAVING `type`=3 AND `jdf`.`containerid` = 5 AND `published` = 1 ORDER BY `ocena`;
Go to the top of the page
+Quote Post
elektrrrus
post
Post #7





Grupa: Zarejestrowani
Postów: 175
Pomógł: 18
Dołączył: 11.06.2007
Skąd: Koszalin/Poznań

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


arghhhh (IMG:http://forum.php.pl/style_emoticons/default/sciana.gif)
Zgłupiałem już, przepraszam, bo wprowadziłem w błąd niechcący, chociaż czytałem to co pisze dwa razy to i tak napisałem źle.

Nie ma pola vote, jest tylko value.

Może dla jasności sytuacji oto pełny zrzut struktury obu tabel:
jos_downloads_files:
  1. `id` int(11) NOT NULL AUTO_INCREMENT,
  2. `sequence` int(11) NOT NULL DEFAULT '0',
  3. `windowtitle` varchar(255) NOT NULL DEFAULT '',
  4. `realname` varchar(255) NOT NULL DEFAULT '',
  5. `islocal` tinyint(3) UNSIGNED NOT NULL DEFAULT '1',
  6. `containerid` smallint(6) NOT NULL DEFAULT '0',
  7. `filepath` varchar(255) NOT NULL DEFAULT '',
  8. `filesize` varchar(255) NOT NULL DEFAULT '',
  9. `filetype` varchar(255) NOT NULL DEFAULT '',
  10. `filetitle` varchar(255) NOT NULL DEFAULT '',
  11. `description` text NOT NULL,
  12. `smalldesc` text NOT NULL,
  13. `autoshort` tinyint(3) UNSIGNED NOT NULL DEFAULT '1',
  14. `license` text NOT NULL,
  15. `licenseagree` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  16. `price` int(11) NOT NULL DEFAULT '0',
  17. `currency` char(3) NOT NULL DEFAULT '',
  18. `downloads` int(11) NOT NULL DEFAULT '0',
  19. `url` varchar(255) NOT NULL DEFAULT '',
  20. `icon` varchar(50) NOT NULL DEFAULT '',
  21. `published` tinyint(3) UNSIGNED NOT NULL DEFAULT '1',
  22. `registered` tinyint(3) UNSIGNED NOT NULL DEFAULT '2',
  23. `userupload` tinyint(3) UNSIGNED NOT NULL DEFAULT '3',
  24. `recommended` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  25. `recommend_text` text NOT NULL,
  26. `featured` tinyint(4) NOT NULL DEFAULT '0',
  27. `featured_st_date` date NOT NULL DEFAULT '2000-01-01',
  28. `featured_end_date` date NOT NULL DEFAULT '2000-01-01',
  29. `featured_priority` smallint(6) NOT NULL DEFAULT '0',
  30. `featured_seq` smallint(6) NOT NULL DEFAULT '0',
  31. `featured_text` text NOT NULL,
  32. `opsystem` varchar(50) NOT NULL DEFAULT '',
  33. `legaltype` varchar(50) NOT NULL DEFAULT '',
  34. `requirements` text NOT NULL,
  35. `company` varchar(255) NOT NULL DEFAULT '',
  36. `releasedate` date NOT NULL DEFAULT '1000-01-01',
  37. `languages` text NOT NULL,
  38. `company_URL` varchar(255) NOT NULL DEFAULT '',
  39. `translator` varchar(255) NOT NULL DEFAULT '',
  40. `fileversion` varchar(50) NOT NULL DEFAULT '',
  41. `fileauthor` varchar(100) NOT NULL DEFAULT '',
  42. `author_URL` varchar(255) NOT NULL DEFAULT '',
  43. `filedate` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',
  44. `filehomepage` varchar(255) NOT NULL DEFAULT '',
  45. `screenurl` varchar(255) NOT NULL DEFAULT '',
  46. `plaintext` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  47. `isblob` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  48. `groupid` smallint(6) NOT NULL DEFAULT '0',
  49. `submittedby` mediumint(9) NOT NULL DEFAULT '0',
  50. `submitdate` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',
  51. `lang` varchar(15) NOT NULL DEFAULT '',


jos_downloads_log:
  1. id int(11) NOT NULL AUTO_INCREMENT,
  2. `type` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  3. `date` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',
  4. userid mediumint(9) NOT NULL DEFAULT '0',
  5. fileid int(11) NOT NULL DEFAULT '0',
  6. `value` int(11) NOT NULL DEFAULT '0',
  7. ipaddress char(15) NOT NULL DEFAULT '',


Dziękuje za dotychczasową pomoc i przepraszam za zamieszanie.

Ten post edytował elektrrrus 27.10.2008, 22:39:22
Go to the top of the page
+Quote Post
osiris
post
Post #8





Grupa: Zarejestrowani
Postów: 121
Pomógł: 15
Dołączył: 19.07.2007

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


  1. SELECT files.*, avgs.value
  2. FROM jos_downloads_files AS files
  3. LEFT JOIN (SELECT file_id , AVG(value) FROM jos_downloads_log WHERE type=3 GROUP BY file_id) AS avgs ON files.id = avgs.file_id
  4. ORDER BY avgs.value


albo

  1. SELECT files.*, (SELECT AVG(value) FROM jos_downloads_log WHERE type=3 AND files.id = file_id) AS avg_value
  2. FROM jos_downloads_files AS files
  3. ORDER BY avg_value
Go to the top of the page
+Quote Post
elektrrrus
post
Post #9





Grupa: Zarejestrowani
Postów: 175
Pomógł: 18
Dołączył: 11.06.2007
Skąd: Koszalin/Poznań

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


Drugie z proponowanych przez osiris-a po dodaniu where na containerid zadziałało.
Dziękuje bardzo za pomoc .


Mimo wszytsko w nowej wersji kodu chyba zastanowie się nad dodaniem kolumny z wagą głosu do tabeli z plikami, kolumna z głosem byłaby aktualizowana wyzwalaczem przy kazdym oddaniu głosu. Wydaje mi się, że to będzie wydajniejsze rozwiązanie.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 20:39