Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zliczanie wartości z wielu kolumn
pitu
post
Post #1





Grupa: Zarejestrowani
Postów: 476
Pomógł: 96
Dołączył: 10.04.2008
Skąd: Koszalin

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


Struktura tabeli:
  1. CREATE TABLE `liczby` (
  2. `ID` int(15) NOT NULL AUTO_INCREMENT,
  3. `Data` date NOT NULL,
  4. `1` int(2) NOT NULL,
  5. `2` int(11) NOT NULL,
  6. `3` int(11) NOT NULL,
  7. `4` int(11) NOT NULL,
  8. `5` int(11) NOT NULL,
  9. `6` int(11) NOT NULL,
  10. PRIMARY KEY (`ID`)
  11. )


Przykładowe dane
  1. INSERT INTO `liczby` (`ID`, `Data`, `1`, `2`, `3`, `4`, `5`, `6`) VALUES
  2. (1, '2011-03-01', 1, 3, 21, 22, 23, 24),
  3. (2, '2011-03-01', 2, 4, 25, 26, 27, 28),
  4. (3, '2011-03-01', 10, 1, 29, 30, 41, 46),
  5. (4, '2011-03-01', 3, 10, 28, 27, 35, 10),
  6. (5, '2011-03-01', 4, 22, 4, 9, 29, 1),
  7. (6, '2011-03-01', 5, 33, 13, 17, 44, 25),
  8. (7, '2011-03-01', 5, 41, 2, 3, 4, 5),
  9. (8, '2011-03-01', 6, 12, 7, 8, 9, 11),
  10. (9, '2011-03-01', 7, 8, 12, 13, 14, 15),
  11. (10, '2011-03-01', 6, 14, 16, 17, 18, 19);


Chcę zliczyć liczbę wystąpień każdej liczby. Dla jednej kolumny nie ma z tym problemu:
  1. SELECT COUNT(*), 1 FROM liczby GROUP BY 1


Czy da się wykonać zapytanie dla wielu kolumn czy trzeba pobrać wszystkie dane i zliczać je po stronie PHP?


--------------------
HTML/CSS/JS: jsfiddle
SQL: sqlfiddle
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
piotrooo89
post
Post #2


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




  1. SELECT COUNT(*) FROM liczby GROUP BY 1,2,3,4,5,6


?


--------------------
Go to the top of the page
+Quote Post
pitu
post
Post #3





Grupa: Zarejestrowani
Postów: 476
Pomógł: 96
Dołączył: 10.04.2008
Skąd: Koszalin

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


Zapytanie nie przedstawia oczekiwanego efektu.

Zapytanie powinno zwracać np.:

Kod
Count(*) | Liczba
1              2
1              3
1              6
2              7
3              15
4              25
1              41
1              45


Taki wynik daje zapytanie, które podałem dla jednej kolumny. Zapytanie podane przez Ciebie zwraca:
Kod
Count(*)
1
1
1
1
1
1
1
1
1
1



--------------------
HTML/CSS/JS: jsfiddle
SQL: sqlfiddle
Go to the top of the page
+Quote Post
Zigi
post
Post #4





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 20.11.2004

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


Sam zrobiłeś prawie dobre zapytanie. Niestety przez nazwy kolumn trzeba je otoczyć >`< aby MySQL uznał, że liczby są kolumnami. Jeśli masz jeszcze szansę to lepiej zmień strukturę tabeli żeby seria kolumn miała przedrostki, bo penie będziesz przez to miał więcej takich problemów.
  1. SELECT COUNT(*), `1` FROM liczby GROUP BY `1`


Ten post edytował Zigi 27.03.2011, 18:38:51
Go to the top of the page
+Quote Post
pitu
post
Post #5





Grupa: Zarejestrowani
Postów: 476
Pomógł: 96
Dołączył: 10.04.2008
Skąd: Koszalin

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


To był tylko przykład, kolumny mają inne nazwy.


--------------------
HTML/CSS/JS: jsfiddle
SQL: sqlfiddle
Go to the top of the page
+Quote Post
piotrooo89
post
Post #6


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




jedyne co wymyśliłem żeby to jakoś sensownie zrobić, to tabela tymczasowa w której masz wszystkie krotki, inaczej jest to niewykonalne (chyba) bez używania programowania proceduralnego i/lub php. pomysł wygląda tak:

mamy tabele:

Kod
SELECT * FROM test;
id |    data    | j  | d  | t  | c  | p  | s  
----+------------+----+----+----+----+----+----
  1 | 2011-03-01 |  1 |  3 | 21 | 22 | 23 | 24
  2 | 2011-03-01 |  2 |  4 | 25 | 26 | 27 | 28
  3 | 2011-03-01 | 10 |  1 | 29 | 30 | 41 | 46
  4 | 2011-03-01 |  3 | 10 | 28 | 27 | 35 | 10
  5 | 2011-03-01 |  4 | 22 |  4 |  9 | 29 |  1
  6 | 2011-03-01 |  5 | 33 | 13 | 17 | 44 | 25
  7 | 2011-03-01 |  5 | 41 |  2 |  3 |  4 |  5
  8 | 2011-03-01 |  6 | 12 |  7 |  8 |  9 | 11
  9 | 2011-03-01 |  7 |  8 | 12 | 13 | 14 | 15
10 | 2011-03-01 |  6 | 14 | 16 | 17 | 18 | 19
(10 rows)


robimy tymczasowa:

  1. CREATE TABLE test_tmp (id serial, DATA date, value integer);


i dodajemy do niej rekordy:

  1. INSERT INTO test_tmp (id, DATA, value)
  2. SELECT id, DATA, j FROM test
  3. UNION
  4. SELECT id, DATA, d FROM test
  5. UNION
  6. SELECT id, DATA, t FROM test
  7. UNION
  8. SELECT id, DATA, c FROM test
  9. UNION
  10. SELECT id, DATA, p FROM test
  11. UNION
  12. SELECT id, DATA, s FROM test;


to pomysł trochę uciążliwy bo pewnie trzeba było by jakiegoś triggera dodać który podczas dodawania do tabeli "głównej" dodawał też do tej tymczasowej ale jest to wykonalne. po stronie proceduralnej (nie wiem jak w mysql) ale w postgre na pewno się da. po stronie php to wiadomo - łatwo, prosto i przyjemnie.


--------------------
Go to the top of the page
+Quote Post
Valdi_B
post
Post #7





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


Proponuję drobne uzupełnienie:
Zamiast "gołego" UNION napisz UNION ALL.

Powód: "Gołe" UNION z automatu eliminuje powtarzające się wiersze, a tego nie chcesz.
Taką eliminację wyłącza właśnie "ALL".
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 Aktualny czas: 19.08.2025 - 18:51