Strona 1 z 1

[SOLVED] konkatenacja i duplikaty rekordów

: pt lis 19, 2010 8:32 pm
autor: czp
Witam.

Używam relacyjnej bazy MySQL wersja 5.1.5 oraz jako frontega bazy pakietu LibreOffice wersja 3.3.0.
Napotkałem na problem przy tworzeniu do bazy zapytania z podwójną konkatenacją, gdzie po sobie występują co najmniej dwa zapytania z konkatenacją do różnych tabel bazy - wówczas w tak otrzymanym wyniku powielają mi się i powstają duplikaty niektórych połączonych tak pól i rekordów.
Problem polega na tym, że nie wiem jak zlikwidować te duplikaty lub jak zmienić zapytanie aby nie powstawały .??????

Podaję kod zapytania:

Kod: Zaznacz cały


SELECT distinct
`dane`.`id_dane`,

GROUP_CONCAT(CONCAT_WS('  ', CONVERT(`dane_obieg`.`data`, CHAR(10)),`dane_obieg`.`obieg`, ' | ') SEPARATOR '\n') AS `data i obieg`,

GROUP_CONCAT(CONCAT_WS('  ', CONVERT(`dane_koniec`.`data_zakonczenia`, CHAR(10)),`lista_wynik`.`wynik_symbol`, ' | ') SEPARATOR '\n') AS `data i wynik `

FROM 
{ OJ `rsd_wk`.`dane` AS `dane` 
LEFT OUTER JOIN `rsd_wk`.`dane_obieg` AS `dane_obieg` ON `dane`.`id_dane` = `dane_obieg`.`fk_id_dane`
LEFT OUTER JOIN `rsd_wk`.`dane_koniec` AS `dane_koniec` ON `dane`.`id_dane` = `dane_koniec`.`fk_id_dane`
LEFT OUTER JOIN `rsd_wk`.`lista_wynik` AS `lista_wynik` ON `dane_koniec`.`fk_id_lista_wynik` = `lista_wynik`.`id_lista_wynik`}

GROUP BY `id_dane`;

poniżej podaję link do obrazu przedstawiającego zapytanie kwerendy oraz wynik zapytania:

http://czp.pl/baza/obraz.jpg

Np. w rekordzie nr 2 w polu `data i obieg` widzimy 3 połączone (takie same) rekordy a powinien być jeden. Dopóki w takich zapytaniach nie było drugiej konkatenacji czyli wyniku w polu `data i wynik` to problem ten nie występował.

Re: konkatenacja i duplikaty rekordów

: pt lis 19, 2010 9:38 pm
autor: Jan_J
Dlaczego pytasz o to na forum OpenOffice'a? Czyżby inne klienty -- np. konsola MySQL -- przedstawiały odpowiedź pozbawioną tego błędu? Nie sądzę; lepiej sprawdź.
W sprawie samego zapytania: być może ktoś tutaj też Ci pomoże, ale pewniej będzie poszukać na forach użytkowników MySQL. Ja sam nie znam dobrze dialektu MySQL-a, i bez wgłębiania się rozumiem z niego mniej więcej tyle, co po kaszubsku.

Re: konkatenacja i duplikaty rekordów

: pt lis 19, 2010 9:47 pm
autor: czp
Dlatego na tym forum też,
bo jako klienta jedynie używam openoffice - tam są formularze do wprowadzania danych , raporty, itp, itd.
Może ktoś wpadnie na jakiś pomysł.

pozdrawiam

ps. sprawdziłem z ciekawości w konsoli MySQL Query Browser-a . ale efekt jest ten sam.

Re: konkatenacja i duplikaty rekordów

: wt lis 23, 2010 11:17 am
autor: czp
Dalej męczę ten temat ale bez zadowalających efektów.

Zauważyłem jednak, że jak podzielę to zapytanie i utworzę dwie kwerendy, z których w jednej utworzę zapytanie z podwójną konkatenacją do tabeli `dane_obieg`, a w drugiej zapytanie z podwójną konkatenacją do tabeli `dane_koniec` to obie osobno działają bez zarzutu. Gdy teraz utworzę trzecia kwerendę i połączę dwie pierwsze kwerendy złączeniem wewnętrznym to otrzymany wynik jest całkowicie poprawny i nie mam powielonych duplikatów żadnych rekordów.

Sposób ten jednak nie odpowiada mi bo tak naprawdę w tym jednym zapytaniu chcę się odnieść do około 10 tabel z podwójną konkatenacją i rozbijanie jednego zapytania na wiele kwerend po prostu zagmatwa całość.

Potrzebuję więc jednego zapytania ale niestety robię w nim gdzieś błąd skoro powielają się rekordy przy złączeniach z podwójną konkatenacją.

Re: konkatenacja i duplikaty rekordów

: wt lis 23, 2010 5:16 pm
autor: czp
Witam.

Problem już rozwiązany dzieki "wookieb" z forum php.pl

prawidłowe zapytanie wygląda tak:

Kod: Zaznacz cały

SELECT 
`dane`.`id_dane`,

GROUP_CONCAT(DISTINCT CONCAT_WS('  ', CONVERT(`dane_obieg`.`data`, CHAR(10)),`dane_obieg`.`obieg`, ' | ') SEPARATOR '\n') AS `data i obieg`,
GROUP_CONCAT(DISTINCT CONCAT_WS('  ', CONVERT(`dane_koniec`.`data_zakonczenia`, CHAR(10)),`lista_wynik`.`wynik_symbol`,  ' | ') SEPARATOR '\n') AS `data i  wynik`


FROM 
{ OJ `rsd_wk`.`dane` AS `dane` 

LEFT OUTER JOIN `rsd_wk`.`dane_obieg` AS `dane_obieg` ON `dane`.`id_dane` = `dane_obieg`.`fk_id_dane`
LEFT OUTER JOIN `rsd_wk`.`dane_koniec` AS `dane_koniec` ON `dane`.`id_dane` = `dane_koniec`.`fk_id_dane`
LEFT OUTER JOIN `rsd_wk`.`lista_wynik` AS `lista_wynik` ON `dane_koniec`.`fk_id_lista_wynik` = `lista_wynik`.`id_lista_wynik`}


GROUP BY `id_dane`;