Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Jak sprawdzić, ile razy występuje dany rekord (ciąg) w zbiorze ?
Greg23
post 12.04.2012, 17:38:29
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 ?


--------------------
Go to the top of the page
+Quote Post
jaslanin
post 12.04.2012, 17:56:56
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
Go to the top of the page
+Quote Post
Greg23
post 13.04.2012, 11:40:29
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


--------------------
Go to the top of the page
+Quote Post
viking
post 13.04.2012, 11:49: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


--------------------
Go to the top of the page
+Quote Post
Greg23
post 13.04.2012, 12:30:37
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 ?


--------------------
Go to the top of the page
+Quote Post
mortus
post 13.04.2012, 13:19:56
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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 ...:
  1. 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


Ten post edytował mortus 13.04.2012, 13:20:46
Go to the top of the page
+Quote Post
Greg23
post 13.04.2012, 17:20:15
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:


  1. EERROR: Unclosed quote @ 87
  2. STR: '
  3. 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
  4.  
  5.  
  6. SQL query: Documentation
  7.  
  8. SELECT `t1`.`nazwa`, COUNT(`t1`.`id`) AS `licznik` FROM `tabela` `t1` WHERE `data` = \'2012-04-12\' GROUP BY `t1`.`nazwa` ORDER BY `licznik` DESC
  9.  
  10. MySQL said: Documentation
  11. #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ą ?

Ten post edytował Greg23 13.04.2012, 17:24:57


--------------------
Go to the top of the page
+Quote Post
mortus
post 13.04.2012, 17:30:55
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
Go to the top of the page
+Quote Post
Greg23
post 13.04.2012, 17:48:44
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:

  1. 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.


--------------------
Go to the top of the page
+Quote Post
mortus
post 14.04.2012, 08:29:43
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/).
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 27.06.2025 - 22:11