Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zliczanie wartości z wielu kolumn
Forum PHP.pl > Forum > Bazy danych > MySQL
pitu
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?
piotrooo89
  1. SELECT COUNT(*) FROM liczby GROUP BY 1,2,3,4,5,6


?
pitu
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

Zigi
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`
pitu
To był tylko przykład, kolumny mają inne nazwy.
piotrooo89
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.
Valdi_B
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".
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.