konto usunięte

Temat: Problem - Mysql

Robię 1 tabelę z 2 tabel, które znajdują się w tej samej bazie danych:
1 tablica składa się z 2 kolumn:
imię
nazwisko
i te dwie kolumny się powtarzają .
Dołączam do niej tablice
z 3 kolumnami, które mają być przyporządkowane konkretnym osobom.
Problem jest w tym, że mają zostać wolne miejsca jak powtarza się osoba, a są jeszcze dane z tych 3 tabel, które jej mam przyporzadkowac
Tzn.
kol1 kol2 kol3 kol4 kol5
im1 n1 1 1 1
im2 n2 2 2 2
3 3 3
im3 n3 4 4 4
5 5 5
6 6 6
7 7 7
im4 n4 8 8 8
9 9 9

Kod programu(Dane zostały zmienione)

SELECT tab1.kol1,tab1.kol2, tab2.kol3, tab2.kol4, tab2.kol5
FROM tab1
LEFT JOIN tab2
ON tab1.id=tab2.id
GROUP BY tab1.kol1,tab1.kol2, tab2.kol3, tab2.kol4, tab2.kol5 ASC ;

Pozdrawiam i z góry dziękuję za odpowiedzi:)

konto usunięte

Temat: Problem - Mysql

Tabele, nie tablice. Tablice i tabele to dwie różne rzeczy. W bazie możesz mieć np. tablicę w tabeli.

Co to znaczy, że "kolumny się powtarzają"? Gdzie się powtarzają, skoro tabela 1 ma tylko dwie kolumny? Wartości w wierszach się powtarzają?

"są jeszcze dane z tych 3 tabel" - jakich trzech tabel, jak tabele są dwie?

"Tzn...." - tego bełkotu, który jest dalej w ogóle nie rozumiem.

To może inaczej: podaj schemat wszystkich tabel. Podaj przykładowe dane. Podaj przykładowy wynik działania zapytania.

konto usunięte

Temat: Problem - Mysql

Wiem, że tabele, nie wiem czemu tak napisalam. Sory moj bład
Robię 3 tabelę z 2 tabel, które znajdują się w tej samej bazie danych:
1 tabela składa się z 2 kolumn:
imię
nazwisko
i te dwie kolumny się powtarzają .
Dołączam do niej tabelę za pomocą Joina, która składa się z 3 kolumn, które mają być przyporządkowane konkretnym osobom.
Problem jest w tym, że mają zostać wolne miejsca jak powtarza się osoba, a są jeszcze dane z tych 3 tabel, które jej mam przyporzadkowac
OSTATECZNIE 3 Tabela ma składać się z 5 kolumn
Tabela utworzona w wyniku tych zapytań ma wyglądać w taki sposób (pobrałam poszczególne kolumny z tych 2 tabel). Puste miejsca mają zostać, ponieważ imie1 i nazwisko1 się powtarza itp.

Wykropkowane miejsca to puste miejsca

kol1.........kol2..................kol3........kol4........kol5
imie1......nazwisko1.....dana1....dana1....dana1
........................................ dana2....dana2.....dana2
........................................dana3.....dana3.....dana3
imie2.....nazwisko2......dana4.....dana4.....dana4
........................................dana5....dana5.....dana5
imie3.....nazwisko3.....dana6.....dana6....dana6
........................................dana7.....dana7....dana7
........................................ dana8....dana8....dana8
....................................... dana9....dana9......dana9
........................................dana10..dana10...dana10
imie4.....nazwisko4.....dana11...dana11 dana11
........................................dana12...dana12..dana12
imie5.....nazwisko5...dana13...dana13....dana13
........................................dana14...dana14...dana14


kod pogramu
SELECT tab1.kol1,tab1.kol2, tab2.kol3, tab2.kol4, tab2.kol5
FROM tab1
LEFT JOIN tab2
ON tab1.id=tab2.id
GROUP BY tab1.kol1,tab1.kol2, tab2.kol3, tab2.kol4, tab2.kol5 ASC ;
Pozdrawiam i z góry dziękuję za odpowiedzi:)
Paweł Broda

Paweł Broda Software Engineer

Temat: Problem - Mysql

nasuwa mi się na myśl hasło 'funkcje analityczne' (i dla pokazywać imię i nazwisko tylko dla
row_number() over (partition by id) = 1
) - ale z tego co wyczytałem to mysql ich nie obsługuje.

tak na szybko można to obejść dodająć to joina trzecią tabelę w postaci ID, MIN(kol3). potem pokazujesz imie i nazwisko tylko jeśli kol3 = min(kol3). trochę to rozwiązanie jest krzywe bo dla dubli imiona i nazwiska wyświetlą się kilka razy.

konto usunięte

Temat: Problem - Mysql

Paweł B.:
nasuwa mi się na myśl hasło 'funkcje analityczne' (i dla pokazywać imię i nazwisko tylko dla
row_number() over (partition by id) = 1
) - ale z tego co wyczytałem to mysql ich nie obsługuje.

tak na szybko można to obejść dodająć to joina trzecią tabelę w postaci ID, MIN(kol3). potem pokazujesz imie i nazwisko tylko jeśli kol3 = min(kol3). trochę to rozwiązanie jest krzywe bo dla dubli imiona i nazwiska wyświetlą się kilka razy.

słabo szukałeś ;)
http://stackoverflow.com/questions/11963818/row-number...

można osiągnąć podobny efekt za pomocą rzeźbiarstwa artystycznego

konto usunięte

Temat: Problem - Mysql

No właśnie o to chodzi, żeby skoro do danej osoby są przyporządkowane kolejne dane, to żeby miejsce na imie i nazwisko pozostalo puste

konto usunięte

Temat: Problem - Mysql

Anka D.:
No właśnie o to chodzi, żeby skoro do danej osoby są przyporządkowane kolejne dane, to żeby miejsce na imie i nazwisko pozostalo puste


A co ty chcesz tym osiągnąć ? Co ma to na celu? Select ma zwrócić dana ich prezentacja to zupełnie inna historia.

konto usunięte

Temat: Problem - Mysql

wlasnie chce to, żeby wyeliminować powtarzające imie i nazwisko, zeby miejsce powtarzających się danych (w 2 pierwszych kolumnach) pozostało puste i powstał raport z listą danych przyporządkowanych do konkretnych osób. Nie wiem jak zrobić wlasnie te puste miejsca.
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Problem - Mysql

To się robi na kliencie, nie w bazie.

konto usunięte

Temat: Problem - Mysql

tzn
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Problem - Mysql

W momencie prezentacji wyników... Nie wiem, w czym to piszesz...

konto usunięte

Temat: Problem - Mysql

w myphpadmin
Albert D.

Albert D. Software Developer

Temat: Problem - Mysql

Nie koniecznie trzeba to robic na kliencie. Mozna to zrobic na bazie ale w MySQL tylko przy uzyciu procedury skladowanej zwracajac wyniki w kursorze.
MySQL ze swoja skladnia SQLa nie nadaje sie do takich rzeczy. Ubogość funkcji analitycznych, a wlasciwie ich brak
powoduje że bardziej skomplikowane operacje tego typu albo trzeba robic za pomoca procedur bazy albo po stronie klienta.
To co chcesz osiagnac, moze da sie zrobic w pojedynczym zapytaniu ale to straszne rzezbiarstwo i szkoda na to czasu :)Ten post został edytowany przez Autora dnia 30.05.14 o godzinie 09:43

konto usunięte

Temat: Problem - Mysql

Albert D.:
Nie koniecznie trzeba to robic na kliencie. Mozna to zrobic na bazie ale w MySQL tylko przy uzyciu procedury skladowanej zwracajac wyniki w kursorze.
MySQL ze swoja skladnia SQLa nie nadaje sie do takich rzeczy. Ubogość funkcji analitycznych, a wlasciwie ich brak
powoduje że bardziej skomplikowane operacje tego typu albo trzeba robic za pomoca procedur bazy albo po stronie klienta.
To co chcesz osiagnac, moze da sie zrobic w pojedynczym zapytaniu ale to straszne rzezbiarstwo i szkoda na to czasu :)

jest taka zasada nie piszmy o czymś o czym mamy blade pojęcie

primo procedura w MySQL-u zwraca wynik w postaci resultsetu jak robisz zwykłego SELECT-a na końcu alo parametrami OUT, kursor jako taki nie jest warunkiem niezbędnym do przekazania wyniku

funkcji analitycznych nie ma - to fakt, ale możemy sobie poradzić np. za pomocą konstrukcji
SET @rank=0;
SELECT @rank := @rank+1 AS rank, fruit, amount
FROM sales
ORDER BY amount DESC;

http://stackoverflow.com/questions/11963818/row-number...
Albert D.

Albert D. Software Developer

Temat: Problem - Mysql

Dzięki za sprostowanie. Masz całkowitą racje :)
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: Problem - Mysql

Aniu... Żaden twój opis nie oddaje treści problemu jaki masz do rozwiązania. Podrzuć może definicje obu tabel. Dodaj nam jakieś przykładowe dane. Powiedz jakie są klucze główne i obce (jeżeli są) tabel.

Jeżeli jest to zadanie akademickie i wykładowca oczekuje od ciebie wyniku postaci:
imie, nazwisko, dana1, dana2, dana3
Jan, Kowalski, cos tam 1, cos tam 2, cos tam 3
NULL, NULL, cos tam 4, cos tam 5, cos tam 6

i określa, że drugi wiersz to dane kowalskiego to chyba powinni takiego zwolnić z nauczania bo nie wie czego oczekuje od swoich studentów.

Przecież brak informacji w kolumnach imie, nazwisko to też informacja. Mówi ona nam, że mamy zestaw danych (cos tam 4, cos tam 5, cos tam 6) ale nie wiemy jakiej osoby one dotyczą. To, że są posortowane w taki sposób wcale nie oznacza, że dotycza osoby w wiersza poprzedzającego lub następującego.

Z twojego przykładu wynika, że "dana 12" dotyczy "imie 4". Posortuj wynik zapytania odwrotnie i wyjdzie ci, że "dana 12" dotyczy "imie 5" co nie jest prawdą. Wniosek z tego taki, że w każdym wierszu wymaga się aby było podane imię oraz nazwisko aby wiedzieć kogo dane dotyczą.
Robert Chmielewski

Robert Chmielewski Senior SQL
Developer, Sagra
Technology sp. z
o.o.

Temat: Problem - Mysql

SELECT CASE LP2 WHEN 1 THEN x.kol1 ELSE '' END AS Imie
,CASE LP2 WHEN 1 THEN x.kol2 ELSE '' END AS Nazwisko
,x.kol3, x.kol4, x.kol5
FROM (

SELECT tab1.kol1,tab1.kol2, tab2.kol3, tab2.kol4, tab2.kol5
,ROW_Number() OVER ( ORDER BY tab1.kol1,tab1.kol2, tab2.kol3, tab2.kol4, tab2.kol5 ) LP1
,ROW_Number() OVER (PARTITION BY tab1.kol1,tab1.kol2 ORDER BY tab1.kol1,tab1.kol2, tab2.kol3, tab2.kol4, tab2.kol5 ) LP2
FROM tab1
LEFT JOIN tab2
ON tab1.id=tab2.id
GROUP BY tab1.kol1,tab1.kol2, tab2.kol3, tab2.kol4, tab2.kol5

)x
Order by LP1Ten post został edytowany przez Autora dnia 02.06.14 o godzinie 14:30

Następna dyskusja:

Problem z MySQL i selectami




Wyślij zaproszenie do