Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Rozbudowane zapytanie do bazy (kilka sum)
wicek
post 17.06.2014, 16:12:02
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 1
Dołączył: 13.02.2014

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


Witam od 3 godzin krążę wkoło rozwiązania i mi umyka ... mam tabele (czynnosc) w której są:
user_id , pod_rodzaj , minuty ,imie,nazwisko,numer_tematu

  1. SELECT SUM(minuty) AS suma FROM czynnosc WHERE numer_tematu='numer_tematu' GROUP BY user_id ORDER BY nazwisko


w ten sposób pobieram sumę minut dla każdego użytkownika , i teraz głowię sie jak rozbudować to zapytanie aby dostać dla każdego użytkownika sumę minut dla pod_rodzaj = Biuro i pod_rodzaj != Biuro

nstępnie za pomocą mysql_fetch_array chciałbym powsadzać sumy w komórki tabeli

Prosze o naprowadzenie lub link do przykładu


Pozdrawiam

Wicek

Ten post edytował wicek 17.06.2014, 18:50:43
Go to the top of the page
+Quote Post
Damonsson
post 17.06.2014, 16:41:40
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


  1. SELECT
  2. SUM(CASE WHEN pod_rodzaj = 'Biuro' THEN minuty ELSE 0 END) sumaBiuro,
  3. SUM(CASE WHEN pod_rodzaj != 'Biuro' THEN minuty ELSE 0 END) sumaNieBiuro
  4. FROM czynnosc WHERE numer_tematu='numer_tematu' GROUP BY user_id ORDER BY nazwisko AS


Tak?

Ten post edytował Damonsson 17.06.2014, 16:42:48
Go to the top of the page
+Quote Post
wicek
post 21.06.2014, 22:30:20
Post #3





Grupa: Zarejestrowani
Postów: 55
Pomógł: 1
Dołączył: 13.02.2014

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


Wszystko bangla jak należy smile.gif

dzięki za pomoc ofc +

// NOWE smile.gif

To teraz mam podobny problem nie wiem ile może być pod_rodzaj chciałbym jednym zapytaniem wyciągnąć do nagłówków kolumn nazwy pod_rodzaj później dla każdego usera zsumować minuty poszczególnych pod_rodzaj i wypisać w odpowiednie kolumny.

user_id|pod_rodzaj1|pod_rodzaj2|pod_rodzaj3
3 | 300 | 0 | 0
6 | 0 | 240 | 60


coś w tym stylu , próbuję samemu ale coś mi umyka. Możliwe że się nie da zrobić tego jednym zapytaniem i dlatego mam problem smile.gif

Z góry dzięki za odpowiedź.

Ok udało mi się to w taki sposób rozwiązac niestety nie jest to jedno zapytanie... Jak by ktoś wiedział jak to urpościć chetnie posłucham smile.gif
  1. $test = mysql_query("SELECT user_id,pod_rodzaj,nazwisko,imie
  2. FROM czynnosc
  3. WHERE numer_tematu='$numer_tematu'
  4. ")
  5. or die (mysql_error());
  6. $tab_pod_rodzaj = array();
  7. $tab_user_id = array();
  8. while($r=mysql_fetch_array($test)) {
  9. $tab_pod_rodzaj[]= $r['pod_rodzaj'];
  10. $tab_user_id[$r['nazwisko'].' '.$r['imie']] = $r['user_id'];}
  11. $tab_user_id=array_unique($tab_user_id);
  12. ksort($tab_user_id);
  13. $tab_pod_rodzaj=array_unique($tab_pod_rodzaj);
  14. sort($tab_pod_rodzaj);
  15. foreach($tab_user_id as $dane_user) {
  16. foreach($tab_pod_rodzaj as $dane_rodzaj){
  17. $suma_osoby = mysql_query("SELECT imie,nazwisko,pod_rodzaj,
  18. COALESCE(SUM(minuty),0) suma
  19. FROM czynnosc WHERE numer_tematu='$numer_tematu' AND user_id='$dane_user' AND pod_rodzaj='$dane_rodzaj'
  20. ")
  21. or die (mysql_error());
  22. }
  23. }
  24. $x = count($tab_pod_rodzaj);
  25. echo '<br><br><br>';
  26. echo"<x><table cellpadding=2 border=1>";
  27. echo"<tr align=center valign=middle>";
  28. echo"<td width=200 height=10 rowspan=2>Osoba</td>";
  29. echo'<td colspan='.$x.' width=150 height=10>Rodzaj</td>';
  30. echo"<td width=50 height=10 rowspan=2>Suma Czasu</td>";
  31. echo"<td width=50 height=10 rowspan=2>Udział</td></tr>";
  32. echo"<tr align=center valign=middle>";
  33. foreach($tab_pod_rodzaj as $dane){
  34. echo '<td>'.$dane.'</td>';
  35. }
  36. echo "</tr>";
  37. foreach($tab_user_id as $dane_user=>$dane_id) {
  38. $czas_pracownika=0;
  39. echo '<tr><td>'.$dane_user.'</td>';
  40. foreach($tab_pod_rodzaj as $dane_rodzaj){
  41. $suma_osoby = mysql_query("SELECT imie,nazwisko,pod_rodzaj,
  42. COALESCE(SUM(minuty),0) suma
  43. FROM czynnosc WHERE numer_tematu='$numer_tematu' AND user_id='$dane_id' AND pod_rodzaj='$dane_rodzaj'
  44. ")
  45. or die (mysql_error());
  46. while($r=mysql_fetch_array($suma_osoby)) {
  47. $czas_pracownika = $czas_pracownika+ $r['suma'];
  48. echo '<td align=center valign=middle>'.print_time($r['suma']).'</td>';
  49. }
  50. }
  51. echo '<td>'.print_time($czas_pracownika).'</td>';
  52. $udzial = $czas_pracownika*100/$time_sum2;
  53. $udzial = number_format($udzial, 1,',',' ');
  54. echo '<td align=center valign=middle>'.$udzial.'%</td>';
  55. echo '</tr>';
  56. }


Ten post edytował wicek 21.06.2014, 10:41:33
Go to the top of the page
+Quote Post
Damonsson
post 22.06.2014, 01:01:15
Post #4





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Ale zagadkę wymyśliłeś wink.gif

Spróbuj czegoś takiego, powinno dać dokładnie to czego oczekujesz:
  1. SET @sql = NULL;
  2. SELECT
  3. GROUP_CONCAT(DISTINCT
  4. CONCAT(
  5. 'SUM(case when `pod_rodzaj` = ''',
  6. `pod_rodzaj`,
  7. ''' then minuty END) AS `pod_rodzaj_',
  8. `pod_rodzaj`, '`'
  9. )
  10. ) INTO @sql
  11. FROM czynnosc;
  12. SET @sql = CONCAT('SELECT user_id, ', @sql,'
  13. FROM czynnosc
  14. WHERE numer_tematu="numer_tematu" GROUP BY user_id ORDER BY nazwisko
  15. ');
  16. PREPARE stmt FROM @sql;
  17. EXECUTE stmt;
  18. DEALLOCATE PREPARE stmt;


Pamiętaj, że nie możesz użyć mysql_query bo wykona tylko 1. zapytanie (do pierwszego ; ).

Powinieneś przejść na PDO lub MySQLi wspierające wiele zapytań.

Gdybyś to chciał wykonać rzeczywiście jednym zapytaniem i użyć mysql_query, to jest to niemożliwe, jakby co. Albo ja się na tyle nie znam, też jest taka możliwość.

Ten post edytował Damonsson 22.06.2014, 12:01:56
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: 7.07.2025 - 13:48