Greg23
12.04.2012, 17:38:29
Mam tabele o takim schemacie:
id, nazwa, data
1, blablabla, 2012-04-12 18:26:33
2, blablabla, 2012-04-12 18:27:56
itd.
Chciałbym pobrać wszystkie rekordy z danego dnia (załóżmy z 12 kwietnia) i posortować je w sposób malejący (w zależności od ilości wystąpień).
Chodzi o to, że nazwy (wyszukiwane frazy) się powtarzają i w danym dniu może być wiele wyszukiwań na taką samą frazę.
Jak w takim razie posortować te dane tak, żeby identyczne rekordy się zsumowały, czyli na przykładzie mamy 2 razy blablabla -> powinno zostać
to zamienione na 1 rekord o nazwie blablabla i liczniku 2 (bo 2 takie same rekordy).
Oczywiście wszystko zapisywane w osobnej tabeli.
Czy jest jakaś funkcja która segreguje identyczne dane w zbiorze w w/w sposób ?
jaslanin
12.04.2012, 17:56:56
prościej jest to zrobić już w momencie dodawania danych do bazy danych przy użyciu INSERT ON DUPLICATE KEY UPDATE, i do obecnej tabeli po prostu dodać kolumne counter, a wyszukiwaną frazę zrobić kluczem głownym
jest taka funkcja GROUP BY i COUNT, możesz też użyć wyzwalaczy (trigger) przy insercie do tej tabeli by w nowej zapisywało podsumowanie
Greg23
13.04.2012, 11:40:29
Mam osobną tabele w której fraza jeśli już kiedyś była wyszukiwana to nie dodaje nowego rekordu,
tylko aktualizuje poprzedni (chociaż w bardziej prymitywny sposób niż podałeś, bo 1 zapytanie sprawdza czy jest taki rekord a następne ewentualnie go aktualizuje, czyli zwiększa jego licznik), jednak to nie nadaje się do robienia dziennych statystyk bo data, to zawsze data 1 wyszukiwania danej frazy, więc nie zrobię listy szukanych w danym dniu.
Muszę więc to zrobić inaczej.
Znam GROUP BY i COUNT ale jak to wykorzystać do pogrupowania fraz ?
/EDIT/
Na myśli przychodzi mi tylko jeden sposób.
Pobieranie wszystkich możliwych rekordów sprawdzanie ich po kolei, czyli wyglądało by to mniej więcej tak:
- bierzemy 1 rekord i porównujemy ze wszystkimi pozostałymi, jeśli są powtórzenia to zliczamy ich liczbę i wstawiamy do kolumny
'licznik' dla 1 rekordu a powtórzenia kasujemy, następnie bierzemy 2 rekord i znowu go porównujemy zliczając liczbę wystąpień identycznych wpisów itd...
Ale to wykombinowałem tak na "chłopski rozum".
Naprawdę nie ma funkcji lub prostszego sposobu na posortowanie wyników w ten sposób ?
viking
13.04.2012, 11:49:10
Wybrać eliminując duplikaty. SELECT DISTINCT
Greg23
13.04.2012, 12:30:37
No ok, ale jak w takim razie zliczyć ilość duplikatów, bo o to się w sumie rozchodzi ?
mortus
13.04.2012, 13:19:56
Cytat(Greg23 @ 12.04.2012, 18:38:29 )

Mam tabele o takim schemacie:
id, nazwa, data
1, blablabla, 2012-04-12 18:26:33
2, blablabla, 2012-04-12 18:27:56
itd.
Chciałbym pobrać wszystkie rekordy z danego dnia (załóżmy z 12 kwietnia) i posortować je w sposób malejący (w zależności od ilości wystąpień).
Chodzi o to, że nazwy (wyszukiwane frazy) się powtarzają i w danym dniu może być wiele wyszukiwań na taką samą frazę.
Jak w takim razie posortować te dane tak, żeby identyczne rekordy się zsumowały, czyli na przykładzie mamy 2 razy blablabla -> powinno zostać
to zamienione na 1 rekord o nazwie blablabla i liczniku 2 (bo 2 takie same rekordy).
Oczywiście wszystko zapisywane w osobnej tabeli.
Czy jest jakaś funkcja która segreguje identyczne dane w zbiorze w w/w sposób ?
GROUP BY powinno wystarczyć, a jak ma to być skopiowane do innej tabeli, to zapytanie INSERT INTO ... SELECT ...:
INSERT INTO `tabela2` (`nazwa`, `licznik`) SELECT `t1`.`nazwa`, COUNT(`t1`.`id`) AS `licznik` FROM `tabela1` `t1` WHERE `data` = '2012-04-12' GROUP BY `t1`.`nazwa` ORDER BY `licznik` DESC
Greg23
13.04.2012, 17:20:15
Mortus, wygląda to całkiem zachęcająco, ale dostaje błąd przy wykonywaniu samego SELECT:
EERROR: Unclosed quote @ 87
STR: '
SQL: SELECT `t1`.`nazwa`, COUNT(`t1`.`id`) AS `licznik` FROM `tabela` `t1` WHERE `data` = \'2012-04-12\' GROUP BY `t1`.`nazwa` ORDER BY `licznik` DESC
SQL query: Documentation
SELECT `t1`.`nazwa`, COUNT(`t1`.`id`) AS `licznik` FROM `tabela` `t1` WHERE `data` = \'2012-04-12\' GROUP BY `t1`.`nazwa` ORDER BY `licznik` DESC
MySQL said: Documentation
#1064 - Something is wrong in your syntax obok '\'2012-04-12\' GROUP BY `t1`.`nazwa` ORDER BY `licznik` DESC' w linii 1
Chodzi na pewno o te backslashe \ dodawane po WHERE przy dacie, ale skąd się one biorą ?
mortus
13.04.2012, 17:30:55
Gdzie wykonujesz zapytanie SELECT? w PHPMyAdmin-ie, czy może przez PHP? Jeśli w PHP, to pokaż kod.
Raczej chodzi o to, że nieprawidłowo generujesz/składasz string-zapytanie SQL.
Greg23
13.04.2012, 17:48:44
Robie to w phpmyadminie. Zauważyłem, że po aktualizacji wersji PHP z LENNY do SUHOSIN nawet zwykłe zapytanie
SELECT ... WHERE powoduje powyższy problem i nie mam pojęcia jak to obejść.
Może ma to związek z infem jakie teraz dostaję w phpmydaminie:
Your PHP MySQL library version 5.1.61 differs from your MySQL server version 5.0.51a. This may cause unpredictable behavior.
Czyli powinienem zaktualizować wersje MySQL ?
Operuje na debianie.
mortus
14.04.2012, 08:29:43
Musisz albo zaktualizować MySQL-a, albo zastąpić rozszerzenie PHP, konkretnie php_mysql odpowiednim dla tej wersji MySQL-a, z której korzystasz. Odpowiedni plik powinieneś znaleźć w katalogu MySQL-a i skopiować do katalogu rozszerzeń PHP (zazwyczaj php/ext/).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.