Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Tabela krzyżowa w MySQL

Nie za bardzo wiem jak to dobrze nazwać (cross table, pivot table ?), więc może przykład:


osoby
id | name
---------
1 | Janek
2 | Franek
3 | Józio

spotkania
id | data
1 | 2009-07-01
2 | 2009-06-23
3 | 2009-05-09

obecnosci (osoby2spotkania)
osoba_id | spotkanie_id
1 | 1
1 | 2
2 | 1
2 | 2
2 | 3
3 | 3


z tych danych chcę uzyskać listę obecności w tej postaci:

osoba | 2009-07-01 | 2009-06-23 | 2009-05-09
Janek | X | X | -
Franek | X | X | X
Józio | - | - | -


Wiem jak to zrobić statycznie, w sensie zrobić select name, (select coś tam) AS '2009-07-01' From ... ale to rozwiązanie mnie nie satysfakcjonuje, gdyż kolejne spotkania będą dodawane, a ja nie chce za każdym razem zmieniać zapytania. Czy da się zrobić to dynamicznie? Jestem pewny, że czystym zapytaniem nie, ale czy procedurą, która np. utworzy listę, a potem do tej listy (cursora?) będzie dodawała kolejne kolumny i zwróci w postaci powyższej?
PS. Nie chcę póki co zaciągać do tego frontendu, ciągle mam nadzieję, że da się to zrobić czystym SQL'em.
PS 2. Jeśli da się to zrobić w innej bazie (Postgre, czy cokolwiek innego darmowego), to też chętnie się o tym dowiem :-)

konto usunięte

Temat: Tabela krzyżowa w MySQL

PS2
mało satysfakcjonujące, ale zupełnie darmowe - baza w pliku mdb (nie wymaga Accessa)
MSSQL 2005 Express - jest PIVOT, tyle że trochę sztywny, ale z odrobiną samozaparcia i dynamicznego SQL-a da radę zrobić
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Tabela krzyżowa w MySQL

jest wersja pod linuksa? :-P
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Tabela krzyżowa w MySQL

Wojciech Sznapka:
select name, (select coś tam) AS '2009-07-01' From ...


Oj nie...
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Tabela krzyżowa w MySQL

Michał Jarosz:
Wojciech Sznapka:
select name, (select coś tam) AS '2009-07-01' From ...


Oj nie...
?
jestem otwarty na inne propozycje :-)
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: Tabela krzyżowa w MySQL

jestem otwarty na inne propozycje :-)

Mnie się podoba to:
http://en.wikibooks.org/wiki/MySQL/Pivot_table
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Tabela krzyżowa w MySQL

Bartosz Ratajczyk:
jestem otwarty na inne propozycje :-)

Mnie się podoba to:
http://en.wikibooks.org/wiki/MySQL/Pivot_table

No mnie też i tak to teraz mam zrobione, ale liczba kolumn jest statyczna, a ja chcę mieć to dynamicznie.
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Tabela krzyżowa w MySQL

Wojciech Sznapka:
Michał Jarosz:
Wojciech Sznapka:
select name, (select coś tam) AS '2009-07-01' From ...


Oj nie...
?
jestem otwarty na inne propozycje :-)

To tak a generalna uwaga. W MySQL unikaj podzapytan w liście pól. Staraj się je przeniść na stronę listy tabel.

Czyli zamiast:


SELCT name, (SELECT obecnosc FROM obecnosci AS o WHERE o.name = p.name AND data = 20090701) AS data1 FROM pracownicy AS p


raczej tak:

SELECT name, data1.obecnosc
FROM pracownicy AS p
LEFT JOIN
SELECT(obecnosc, name FROM obecnosci WHERE data = 20090701) AS data1
ON (p.name = data1.name)


Zysk na prędkości tym większy, im więcej nazwisk na liście ;)
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Tabela krzyżowa w MySQL

Nazwisk będzie do 20, ale dzięki za uwagę, przyda się przy innych rzeczach :-)
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: Tabela krzyżowa w MySQL

Michał Jarosz:
To tak a generalna uwaga. W MySQL unikaj podzapytan w liście pól. Staraj się je przeniść na stronę listy tabel.

Wiesz z doświadczenia, czy jest to też gdzieś szerzej opisane? Przejąłem jedną aplikację, gdzie jest sporo zapytań bezpośrednio w kolumnach i chętnie bym to przepisał.
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Tabela krzyżowa w MySQL

To moje doświadczenie akurat, ale jak już "się doświadczyłem", to gdzieś czytałem skąd się to bierze. Podzapytania po stronie listy kolumn są po prostu wykonywane dla każdego wiersza.
Bartłomiej O.

Bartłomiej O. FIOBE - freelance,
web development

Temat: Tabela krzyżowa w MySQL

Calosc w mysql

SELECT
tmp_osoby.imie,
tmp_spotkania.data,
CASE WHEN tmp_obecnosci.id IS NULL
THEN 0
ELSE 1
END as obecnosc
FROM
(
SELECT
tmp_osoby.ido,
tmp_spotkania.ids
FROM
tmp_spotkania,
tmp_osoby
)as tab1
LEFT JOIN tmp_osoby ON
tmp_osoby.ido = tab1.ido
LEFT JOIN tmp_spotkania ON
tmp_spotkania.ids = tab1.ids
LEFT JOIN tmp_obecnosci ON
tmp_obecnosci.ido = tab1.ido
AND tmp_obecnosci.ids = tab1.ids
ORDER BY
tmp_osoby.imie,
tmp_spotkania.data

Takie zapytanie pozostaje juz tylko przeksztalcic na pivota. Jezeli natomiast calosc wrzucisz do procedury skladowanej to mozna zrobic dynamicznie nazwy kolumn za pomoca skladanego dynamicznie zapytania
http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prep...
Maciej Filipiak

Maciej Filipiak właściciel, VizMedia

Temat: Tabela krzyżowa w MySQL

Nie wiem co to pivot, ale zgodnie ze sztuką zapytania wiele do wiele robi się za pomocą trzeciej tabeli.

tabela 1 - daty
babela 2 - goście

tabela 3 - spina gości z datami

Po co burzyć standardy ?

konto usunięte

Temat: Tabela krzyżowa w MySQL

Maciej Filipiak:
Nie wiem co to pivot, ale zgodnie ze sztuką zapytania wiele do wiele robi się za pomocą trzeciej tabeli.

Pivot to takie mityczny zwierz ułatwiający analizę danych dowolnych
pozwal np. ocenić zmianę czegoś na przestrzeni okresów czasu tak że wszystkie dane dla zjawiska są w jednym wierszy, Okresy zaś są kolumnami - prawie jak w Excel-u

tabela 1 - daty
babela 2 - goście

tabela 3 - spina gości z datami

Po co burzyć standardy ?

dane w takiej postaci możesz przekształcić dopiero w narzędziu zewnętrznym w taki sposób aby otrzymać okresy w postaci kolumn, takim narzędziem jest np. Excel i tabela przestawna
Maciej Filipiak

Maciej Filipiak właściciel, VizMedia

Temat: Tabela krzyżowa w MySQL

Przemysław R.:
Pivot to takie mityczny zwierz ułatwiający analizę danych

dzięki :)
dane w takiej postaci możesz przekształcić dopiero w narzędziu zewnętrznym w taki sposób aby otrzymać okresy w postaci kolumn,

No to chyba logicznie, że baza danych służy do przechowywania danych a nie do ich prezentacji.
Chodzi o jakość, wydajność i skalowalność - tak zwana któraś tam postać normalna :)
takim narzędziem jest np. Excel i tabela przestawna

Co Ty z tym microShitem ? są inne sposoby, żeby sobie życie skomplikować :)

konto usunięte

Temat: Tabela krzyżowa w MySQL

Maciej Filipiak:
dane w takiej postaci możesz przekształcić dopiero w narzędziu zewnętrznym w taki sposób aby otrzymać okresy w postaci kolumn,
No to chyba logicznie, że baza danych służy do przechowywania danych a nie do ich prezentacji.
Chodzi o jakość, wydajność i skalowalność - tak zwana któraś tam postać normalna :)

zgadza się
nie twierdzę ze ma byc inaczej, Pivot ułatwia tylko życie
takim narzędziem jest np. Excel i tabela przestawna

Co Ty z tym microShitem ? są inne sposoby, żeby sobie życie skomplikować :)

akurat Excel to urzyteczne narzędzie, ułatwia życie o ile umie sie z niego skorzystać
Maciej Filipiak

Maciej Filipiak właściciel, VizMedia

Temat: Tabela krzyżowa w MySQL

Przemysław R.:
akurat Excel to urzyteczne narzędzie, ułatwia życie o ile umie sie z niego skorzystać

Do podliczenia bilingu telefonicznego - też używam excela - i do niczego więcej.

Do zastosowań domowych, albo narzędzie dla sekretarek - bo w biznesie Excel nie ma zastosowania.
Już prędzej Access - ale to też w mikro-zastosowaniach. Gdy np. mechanik samochodowy chce sobie bazę klientów zrobić.

Jeżeli ktoś chce zostać programistą baz danych - to najlepiej excela i accesa nie dotykać. Strata czasu i wprowadzają złe nawyki.
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Tabela krzyżowa w MySQL

Maciej Filipiak:

Do podliczenia bilingu telefonicznego - też używam excela - i do niczego więcej.

Do zastosowań domowych, albo narzędzie dla sekretarek - bo w biznesie Excel nie ma zastosowania.

pierwsze słyszę, może mówisz o swoim biznesie.
Karol S.

Karol S. Software Engineer @
VMware, Palo Alto,
USA

Temat: Tabela krzyżowa w MySQL

Maciej Filipiak:
Przemysław R.:
akurat Excel to urzyteczne narzędzie, ułatwia życie o ile umie sie z niego skorzystać

Do podliczenia bilingu telefonicznego - też używam excela - i do niczego więcej.

Do zastosowań domowych, albo narzędzie dla sekretarek - bo w biznesie Excel nie ma zastosowania.
Już prędzej Access - ale to też w mikro-zastosowaniach. Gdy np. mechanik samochodowy chce sobie bazę klientów zrobić.

Jeżeli ktoś chce zostać programistą baz danych - to najlepiej excela i accesa nie dotykać. Strata czasu i wprowadzają złe nawyki.

bez urazy, ale Ty chyba w życiu biznesu na oczy nie widziałeś...

konto usunięte

Temat: Tabela krzyżowa w MySQL

Maciej Filipiak:
Przemysław R.:
akurat Excel to urzyteczne narzędzie, ułatwia życie o ile umie sie z niego skorzystać

Do podliczenia bilingu telefonicznego - też używam excela - i do niczego więcej.

Excel ma szereg zalet np ładnie prezentuje dane z bazy danych w postaci słupków :)
tebele przestawne też fajnie liczą i grupują dane
Akurat Excel średnio nadaje się do liczenia bilingów - z racji miejsca w którym pracuję, temat nie jest mi obcy
Do zastosowań domowych, albo narzędzie dla sekretarek - bo w biznesie Excel nie ma zastosowania.
Już prędzej Access - ale to też w mikro-zastosowaniach. Gdy np. mechanik samochodowy chce sobie bazę klientów zrobić.

Jeżeli ktoś chce zostać programistą baz danych - to najlepiej excela i accesa nie dotykać. Strata czasu i wprowadzają złe nawyki.

Excel nie służy do gromadzenia danych lecz do liczenia, prezentowania i tego typu dupereli
Access jest bazą danych - prostą w implementacji lecz o szerszych mozliwościach niż piszesz

w obu przypadkach trzeba wiedzieć do jakich celów danego produktu użyć
twierdzenie że oba produkty nie nadają się do biznesu to czysta demagogia
trzeba wiedzieć co do czego użyć i w jakim zakresie

Następna dyskusja:

Tabela w MySQL - 350 mb




Wyślij zaproszenie do