Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Powielanie danych - wybieranie rekordów po 2 razy (?)
Forum PHP.pl > Forum > Bazy danych > MySQL
Mike0
Dobry wieczór, mam taki mały problem i myślę jak go najlepiej rozwiązać, mam nadzieję, że pomożecie mi i przedyskutujemy najrozsądniejsze rozwiązanie.

A więc: mam tabelę w MySQL, zawierającą 30,000 rekordów. Załóżmy, że tabela `polaczenia` wygląda tak:
Kod
id | lokacja1_id | lokacja2_id | inne pola....
a tabela `lokacja`, wygląda tak:
Kod
id | nazwa | opis


Potrzebuję wybrać z tabeli `polaczenia` wszystkie możliwe połączenia (więc lokacja1 -> lokacja2 oraz lokacja2 > lokacja1) posortowane alfabetycznie według nazwy tych lokacji.

I teraz pytanie jak to osiągnąć?

Od razu narzuciło mi się: skopiowanie wszystkich rekordów, zamieniając wyłącznie miejscami pola z ID lokacji, a do tego ustawić crona, który będzie co jakiś czas wywalał wszystkie sklonowane rekordy i wstawiał je na nowo. Jednak w tabeli połączeń jest dużo innych pól ze szczegółami połączania, pasujących do obu wariacji. Tak więc nie ma sensu kopiować tych danych (a tym bardziej wprowadzać manualnie obu wersji do bazy). No i jest kwestia ID, przy takim rozwiązaniu ich pula się bardzo szybko wykończy przy int(11). To rozwiązanie bardzo bardzo mi się nie podoba, ale na razie nie wymyśliłem nic lepszego thumbsdownsmileyanim.gif

A może za bardzo kombinuję i istnieje magiczne zapytanie sql, które mi z tym pomoże? biggrin.gif

Pomóżcie mi proszę, każdy pomysł będzie przydatny.
Pyton_000
Pokaż przykładowe dane i jaki efekt chcesz uzyskać
Mike0
Dobry wieczór,

Dokładnie tak jak pisałem, mam tabelę z połączeniami (na przykład):
Kod
id | lokacja1_id | lokacja2_id| opis_trasy | odległość | uwagi
1 | 1 | 3 | Dobra droga, około 3.5h jazdy samochodem | brak
2 | 1 | 2 | Brak informacji. | Uwaga na radary

i tabelę samych lokacji:
Kod
id | nazwa | opis
1 | Warszawa | Stolica Polski....
2 | Gdańsk | Piękne miasto
3 | Kraków | Zapiekanki na Kazimierzu


I chcę wyświetlić listę połączeń, tak więc:
  1. Gdańsk - Warszawa
  2. Kraków - Warszawa
  3. Warszawa - Gdańsk
  4. Warszawa - Kraków
mmmmmmm
  1. SELECT m1.nazwa `od`, m2.nazwa `do` FROM polaczenia p JOIN lokacje m1 ON p.lokacja1_id=m1.id JOIN lokacje m2 ON p.lokacja2_id=m2.id
Mike0
Niestety nie o to mi chodziło, to zapytanie jedynie wyciąga nazwy powiązanych lokacji, mi chodzi o to by odpowiednio dublowało rekordy, dokładnie tak jak opisałem w przykładzie.
Pyton_000
To dodaj drugie takie zapytanie połączone UNION zamieniając miejscami kolumny i po sprawie
mmmmmmm
Bez sensu robić to w bazie. Zrób to na kliencie.
mrygiel
Tak jak napisał Pyton_000 - możesz po prostu obrócić kolumny i dodac UNION, dam przykład:

  1.  
  2. SELECT
  3. L1.nazwa AS skad,
  4. L2.nazwa AS dokad,
  5. P.odleglosc,
  6. P.opis_trasy,
  7. P.uwagi
  8. FROM
  9. polaczenia P
  10. JOIN lokacje L1 ON L1.id = P.lokacja1_id
  11. JOIN lokacje L2 ON L2.id = P.lokacja2_id
  12.  
  13. UNION
  14.  
  15. SELECT
  16. L2.nazwa AS skad,
  17. L1.nazwa AS dokad,
  18. P.odleglosc,
  19. P.opis_trasy,
  20. P.uwagi
  21. FROM
  22. polaczenia P
  23. JOIN lokacje L1 ON L1.id = P.lokacja1_id
  24. JOIN lokacje L2 ON L2.id = P.lokacja2_id

Wyniki uzyskasz wtedy następujące:

"skad" "dokad" "odleglosc" "opis_trasy" "uwagi"
"Warszawa" "Kraków" "200" "Dobra droga, około 3.5h jazdy samochodem" ""
"Warszawa" "Gdańsk" "300" "Brak informacji" "uwaga na radary"
"Kraków" "Warszawa" "200" "Dobra droga, około 3.5h jazdy samochodem" ""
"Gdańsk" "Warszawa" "300" "Brak informacji" "uwaga na radary"

Pozdrawiam smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.