Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Drzewo znajomości., Problem w sformułowaniu zapytania.
Morfina
post 18.04.2014, 14:08:05
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 4.09.2013

Ostrzeżenie: (0%)
-----


Witam ponownie,
po raz kolejny zwracam się z prośbą o pomoc do gremium użytkowników tego forum z zadaniem, które spędza mi sen z powiek.

Dane


W tabeli widzimy dwie kolumny, Osoby 1 oraz Osoby 2, tabela przedstawia znajomości, czyli dla pierwszego rekordu osoba „a” zna osobę „1”. Widzimy także, że dla rekordu drugiego osoba „1” zna osobę „b” . Osoby „a,b,1” nie występują w żadnej innej znajomości czyli tworzą grupę 1 ( widzimy to w tabeli Wynikowej). Dla grupy trzeciej osoba „e” zna „3 i 4” a wiec grupa 3 obejmuje osoby „3,4,g,h,f,e”. Oczywiście jest to reprezentatywny przykład mojego problemu.

Z góry dziękuję za jakiekolwiek podpowiedzi.

Pozdrawiam Morf.
Go to the top of the page
+Quote Post
Morfina
post 24.04.2014, 20:07:51
Post #2





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 4.09.2013

Ostrzeżenie: (0%)
-----


Witam,
Dziękuję koledze za odpowiedź na mój post.
Mam nieco inne rozwiązanie, które całkiem skutecznie działa. Przyznam, że nie do końca ogarniam rozwiązanie zaproponowane powyżej . Ciekawe czy da się to jeszcze jakoś prościej rozwiązać questionmark.gif

ID_P to Osoba 1
ID_L to Osoba 2

  1. SELECT *, ROW_NUMBER() Over(ORDER BY ID_P) AS Grupa
  2. INTO #Temp_P
  3. FROM dbo.Powiazania;
  4. GO
  5.  
  6. -- Uruchamiamy kilka razy
  7. UPDATE #Temp_P SET #Temp_P.Grupa = T2.Grupa
  8. FROM #Temp_P INNER JOIN #Temp_P AS T2 ON (#Temp_P.ID_P = T2.ID_P) And (#Temp_P.Grupa > T2.Grupa)
  9. GO
  10.  
  11. UPDATE #Temp_P SET #Temp_P.Grupa = T2.Grupa
  12. FROM #Temp_P INNER JOIN #Temp_P AS T2 ON (#Temp_P.ID_L = T2.ID_L) And (#Temp_P.Grupa > T2.Grupa)
  13. GO
  14.  
  15. -- Na koniec
  16. SELECT ID_P,ID_L, DENSE_RANK() Over(ORDER BY Grupa) AS Ranking
  17. FROM #Temp_P;
  18. GO


Pozdrawiam
Morfina
Go to the top of the page
+Quote Post
juris
post 25.04.2014, 07:15:29
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 1
Dołączył: 12.03.2014

Ostrzeżenie: (0%)
-----


Twoje podejście jest proceduralne - tak jak pisałem wcześniej, to nie jest problem. W takim przypadku użyj pętli WHILE i sprawdzaj czy w danym kroku zostały zupdateowane rekordy czy nie (w końcu przy wielu relacjach nie będziesz tego klikał z palucha kilka (ile?) razy wink.gif).

Moje rozwiązanie to jedna kwerenda i jest uniwersalna (po rozszerzeniu na końcu o substring ( ID ) ).

Pozdrowienia !
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 08:10