![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 120 Pomógł: 0 Dołączył: 6.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
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 ? -------------------- |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 511 Pomógł: 143 Dołączył: 13.03.2010 Skąd: Jasło Ostrzeżenie: (0%) ![]() ![]() |
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 Ten post edytował jaslanin 12.04.2012, 17:57:30 -------------------- Good luck and happy PHP'ing
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 120 Pomógł: 0 Dołączył: 6.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
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 ? Ten post edytował Greg23 13.04.2012, 11:41:10 -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 378 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Wybrać eliminując duplikaty. SELECT DISTINCT
-------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 120 Pomógł: 0 Dołączył: 6.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
No ok, ale jak w takim razie zliczyć ilość duplikatów, bo o to się w sumie rozchodzi ?
-------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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 ...:
Ten post edytował mortus 13.04.2012, 13:20:46 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 120 Pomógł: 0 Dołączył: 6.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Mortus, wygląda to całkiem zachęcająco, ale dostaje błąd przy wykonywaniu samego SELECT:
Chodzi na pewno o te backslashe \ dodawane po WHERE przy dacie, ale skąd się one biorą ? Ten post edytował Greg23 13.04.2012, 17:24:57 -------------------- |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował mortus 13.04.2012, 17:36:58 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 120 Pomógł: 0 Dołączył: 6.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
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:
Czyli powinienem zaktualizować wersje MySQL ? Operuje na debianie. -------------------- |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
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/).
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 27.06.2025 - 22:11 |