Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Policzenie wystąpień
Forum PHP.pl > Forum > Bazy danych > MySQL
e-konrad
Witam wszystkich

Mam problem z dodaniem do poniższego kodu funkcji count. Zasada działa kodu jest taka że do konkretnej lokalizacji przypisany jest numer telefonu. Numery są przechowywane w innej tabeli, natomiast na stronie docelowej obok lokalizacji wyświetlany jest numer telefonu. Zdarza się że do jednej lokalizacji przypisanych jest kilka numerów. W jaki sposób policzyć ilość wystąpień danej lokalizacji?

  1. $query = mysql_query("SELECT object, object_phone, telefon FROM phonebook INNER JOIN dane ON phonebook.object_phone = dane.telefon");
  2. while($show = mysql_fetch_assoc($query)){
  3. echo $show['object']." - ".$show['telefon']."<br />";
  4. }
Prezi2907
Cytat(e-konrad @ 10.09.2013, 22:14:13 ) *
Witam wszystkich

Mam problem z dodaniem do poniższego kodu funkcji count. Zasada działa kodu jest taka że do konkretnej lokalizacji przypisany jest numer telefonu. Numery są przechowywane w innej tabeli, natomiast na stronie docelowej obok lokalizacji wyświetlany jest numer telefonu. Zdarza się że do jednej lokalizacji przypisanych jest kilka numerów. W jaki sposób policzyć ilość wystąpień danej lokalizacji?

  1. $query = mysql_query("SELECT object, object_phone, telefon FROM phonebook INNER JOIN dane ON phonebook.object_phone = dane.telefon");
  2. while($show = mysql_fetch_assoc($query)){
  3. echo $show['object']." - ".$show['telefon']."<br />";
  4. }



Nie jasna jest trochę ta tabela. Co to object, object phone ? Phonebook to tablica z samymi numerami czy też z danymi adresowymi? Tabela dane co zawiera? Uprość sobie nazywnictwo bo tak sam sobie kłody podkładasz... smile.gif
e-konrad
Tabela phonebook
  1. CREATE TABLE IF NOT EXISTS `phonebook` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `object` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
  4. `object_phone` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=29 ;


Tabela dane
  1. CREATE TABLE IF NOT EXISTS `dane` (
  2. `id` int(255) NOT NULL AUTO_INCREMENT,
  3. `telefon` varchar(255) NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=118 ;



W tabeli phonebook do każdego obiektu przypisuje numer telefonu, następnie wprowadzam numery telefonów to tabeli dane i robię porównanie chcąc uzyskać informacje do jakiego obiektu przypisany jest numer telefonu. Są oczywiście powtórzenia obiektów poniważ do jednego obiektu przypisanych jest kilka numerów. Potrzebuję uzyskać informację ile razy każdy z obiektów się powtarza.
Prezi2907
No to teraz pomogę smile.gif
Połaczenie tych tabel jest mało wydajne. Lepiej robić to po indeksach głównych (ID)

  1.  
  2. SELECT object , object_phone , telefon, ph_ile FROM phonebook p
  3. JOIN dane d ON p.object_phone = d.telefon
  4. LEFT JOIN (SELECT count(ph.id) ph_ile , ph.object obj FROM phonebook ph GROUP BY object ) ob ON ob.obj=p.object
  5.  

Sprawdź jeszcze czy ten left join tam pasuje smile.gif Wg mnie powinno być ok ale dawno nie stosowałem tego zapytania i nie wiem czy merytorycznie dobrze to ująłem smile.gif
e-konrad
Wcześniej dane wyświetlałem przy pomocy
  1. while($show = mysql_fetch_assoc($query)){
  2. echo $show['object']." - ".$show['telefon']."<br />";
  3. }


Po Twojej modyfikacji zapytania SELECT w jaki sposób wyświetlić wyniki w postaci: obiekt - ile powtórzeń?
freemp3
Czy, aby przypadkiem nie masz gdzieś jeszcze tabeli, która przechowuje obiekty?
Czy telefon może być przypisany tylko do jednego obiektu, czy do wielu? Korzystasz z jakiegoś gotowego mechanizmu, czy sam wszystko napisałeś i możesz bezproblemowo zmienić strukturę bazy?
e-konrad
W tabeli phonebook przechowuję dane o obiektach i numerach telefonów do nich przypisanych
freemp3
W takim wypadku powinieneś przenieść relacje z tabeli phonebook do dane. W tedy z tabeli phonebook wylatuje kolumna object_phone, a w tabeli dane dodajesz kolumne object_id. Zakładam, że konkretny numer telefonu może być przypisany tylko do jednego obiektu. W tedy unikniesz nadmiarowości danych w tabeli phonebook.
Co do samego liczenia to możesz wykorzystać polecenie COUNT(*) na tabeli phonebook, oczywiście już po poprawie struktury oraz usunięciu zbędnych danych. Jeśli chcesz sprawdzić w pętli podanej w pierwszym poście możesz utworzyć sobie pustą tablice, do której będziesz wrzucał obiekty. Jeśli będzie się on już znajdował w tablicy, w tedy logicznie nie dodajesz. Później przy pomocy funkcji count sprawdzasz ilość obiektów.
e-konrad
W tabeli phonebook mam dane w postaci:

| object | phone_number |
|-----------------------------
| Poznań | 1234567 |
| Wrocław| 2132435 |
| Poznań | 7654321 |


Do jednego obiektu będzie przypisane po kilka numerów
freemp3
Zrób coś takiego:
Kod
Tabela phonebook:
|id|object|
| 1| name1|
| 2| name2|
| 3| name3|

Tabela data
|id|object_id|phone|
| 1|        1|12345|
| 2|        1|12356|
| 3|        2|45678|
| 4|        3|98756|
| 5|        3|45623|


e-konrad
Jeżeli tak zrobie jak to opisałeś to będę musiał stworzyć jeszcze jedną tabelę z samymi numerami telefonów. Ogólnie zasada skryptu ma polegać na tym że do zdefiniowanych wcześniej numerów tel do obiektów będę porównywać listę z samymi numerami i w razie dopasowania przy numerze pojawi mi się nazwa obiektu

Zmodyfikowałem strukturę bazy danych i udało mi się uzyskać pożądany efekt. Chciałem aby wyniki były zobrazowane wykresem, wybrałem biblioteki LabCharts, ale mam problemy z generowaniem wykresów.

  1. <?php
  2. include_once('LabCharts/LabChartsPie.php');
  3.  
  4.  
  5. $query = mysql_query("SELECT count(p.object) AS ile, p.object, ph.object_id FROM dane d
  6. INNER JOIN phone ph ON ph.phone=d.telefon
  7. INNER JOIN phonebook p ON p.id=ph.object_id GROUP BY p.object");
  8.  
  9. $i=1;
  10. while($show = mysql_fetch_array($query)){
  11. $obiekty = $show[1];
  12. $ile = $show[0];
  13. $LabChartsPie = new LabChartsPie();
  14. echo $i++.". ".$show[1]." - ".$show[0]."<br />";
  15. $LabChartsPie->setData(array($ile));
  16. $LabChartsPie->setLabels ($obiekty);
  17. }
  18.  
  19. ?>
  20.  
  21. <img src="<?php $LabChartsPie->getChart(); ?>"/>
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.