DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   SQL baze podataka - Sponzor: Baze-Podataka.net (http://www.devprotalk.com/forumdisplay.php?f=10)
-   -   Problem sa dupliranjem nekih rezultata u SELECT DISTINCT ... LEFT JOIN upitu (http://www.devprotalk.com/showthread.php?t=721)

IcecreamMan 28. 02. 2006. 13:46

Problem sa dupliranjem nekih rezultata u SELECT DISTINCT ... LEFT JOIN upitu
 
Pozdrav,

Imam sledeci problem,
SELECT DISTINCT upit sa vise LEFT JOIN -a duplira neke rezultate
na verziji mysql -a 3.23.58, dok na verziji 3.23.56 radi ocekivano (kako bi ja hteo :) )

Evo upita:
SELECT DISTINCT (cs_update_queries.reference_number)
FROM cs_update_queries, cs_update_draft_stage, cs_listing_numbers, cs_personal_info, cs_personal_info a

LEFT JOIN cs_listing_info ON cs_listing_info.property_id = cs_update_queries.property_id
LEFT JOIN cs_rental_info ON cs_rental_info.property_id = cs_update_queries.property_id
LEFT JOIN cs_appraisal_info ON cs_appraisal_info.property_id = cs_update_queries.property_id
LEFT JOIN cs_personal_info l ON l.person_id = cs_listing_info.assigned_to
LEFT JOIN cs_personal_info r ON r.person_id = cs_rental_info.assigned_to
LEFT JOIN cs_personal_info ap ON ap.person_id = cs_appraisal_info.assigned_to

WHERE cs_update_queries.completed = '0'
AND cs_update_queries.reference_number = cs_update_draft_stage.reference_number
AND cs_update_queries.property_id = cs_listing_numbers.listing_id
AND cs_update_queries.submitter_id = cs_personal_info.person_id
AND a.person_id
IN ( 0, 11837, 11668, 11658, 11921, 11652, 11675, 16580, 11665, 12485, 11679, 11672, 11666, 11688 ) AND ((l.person_id = a.person_id OR cs_listing_info.assigned_to = 0)
OR (r.person_id = a.person_id OR cs_rental_info.assigned_to = 0)
OR (ap.person_id = a.person_id OR cs_appraisal_info.assigned_to = 0))
AND cs_update_draft_stage.status = 'waiting'
AND (field_name
NOT IN ('assigned_to', 'present_status', 'listing_price', 'date_sold', 'selling_price', 'buyer_id', 'price_text_id', 'rental_status')
AND table_name <> 'cs_agency_info'
AND (field_name <> 'status' OR table_name <> 'cs_listing_info'))
AND office_id IN ( 0, 2, 1, 8, 6 )

ORDER BY cs_update_queries.date
LIMIT 10 , 10

ovo su rezultati na 3.23.56: nema duplikata
11665_20051220085047
11688_20051230162313
11665_20060106140929
11837_20060125114140
16580_20060125144715
11672_20060125162818
11672_20060126143555
11672_20060127121658
11672_20060127125540
11672_20060127130022

ovo su rezultati na 3.23.58:
11672_20060127131244
11672_20060130103227
11672_20060130104337

11672_20060130104643
11672_20060130104643

11672_20060130104908

11672_20060130111706
11672_20060130111706
11672_20060130111706

11675_20060201104657

Jel' ima neko ideju zasto se ovo desava?
Inace, na prvoj strani LIMIT 0, 10 nema ponavljanja.

Milos Vukotic 28. 02. 2006. 14:03

Ovako, na brzinu: Vidi duplira li kad izbacis "ORDER BY" iz upita. Ako ti daje rezultat kako treba, vidi ovo:
http://dev.mysql.com/doc/refman/5.0/...imization.html
Citat:

DISTINCT combined with ORDER BY needs a temporary table in many cases.

IcecreamMan 28. 02. 2006. 14:26

Hvala puno,
nema duplikata kad izbacim ORDER BY, pogledacu dati link.

IcecreamMan 01. 03. 2006. 13:53

Pogledao sam link, DISTINCT se smatra nekom vrstom specijalnog slucaja GROUP BY,
da bi zadrzali sortiranje, u upit se dodaje GROUP BY po DISTINCT vrednosti, a zatim ORDER BY.

upit konacno izgleda ovako:
SELECT DISTINCT (cs_update_queries.reference_number)
FROM cs_update_queries, cs_update_draft_stage, cs_listing_numbers, cs_personal_info, cs_personal_info a

LEFT JOIN cs_listing_info ON cs_listing_info.property_id = cs_update_queries.property_id
LEFT JOIN cs_rental_info ON cs_rental_info.property_id = cs_update_queries.property_id
LEFT JOIN cs_appraisal_info ON cs_appraisal_info.property_id = cs_update_queries.property_id
LEFT JOIN cs_personal_info l ON l.person_id = cs_listing_info.assigned_to
LEFT JOIN cs_personal_info r ON r.person_id = cs_rental_info.assigned_to
LEFT JOIN cs_personal_info ap ON ap.person_id = cs_appraisal_info.assigned_to

WHERE cs_update_queries.completed = '0'
AND cs_update_queries.reference_number = cs_update_draft_stage.reference_number
AND cs_update_queries.property_id = cs_listing_numbers.listing_id
AND cs_update_queries.submitter_id = cs_personal_info.person_id
AND a.person_id
IN ( 0, 11837, 11668, 11658, 11921, 11652, 11675, 16580, 11665, 12485, 11679, 11672, 11666, 11688 ) AND ((l.person_id = a.person_id OR cs_listing_info.assigned_to = 0)
OR (r.person_id = a.person_id OR cs_rental_info.assigned_to = 0)
OR (ap.person_id = a.person_id OR cs_appraisal_info.assigned_to = 0))
AND cs_update_draft_stage.status = 'waiting'
AND (field_name
NOT IN ('assigned_to', 'present_status', 'listing_price', 'date_sold', 'selling_price', 'buyer_id', 'price_text_id', 'rental_status')
AND table_name <> 'cs_agency_info'
AND (field_name <> 'status' OR table_name <> 'cs_listing_info'))
AND office_id IN ( 0, 2, 1, 8, 6 )

GROUP BY cs_update_queries.reference_number
ORDER BY cs_update_queries.date
LIMIT 10 , 10

Milose, hvala na ultra brzom odgovoru


Vreme je GMT +2. Trenutno vreme je 07:08.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.