Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Pobranie powiązanych rekordów i ich powiązanych
Forum PHP.pl > Forum > Przedszkole
nyfko
Witam. By wyjaśnić problem przedstawię wymyśloną sytuację jako przykład.

Mam np. tabelę "rtv" z kolumnami ID, nazwa, powiązanie z wierszami:

Kod
ID     nazwa               powiazanie
--------------------------------------
1   Komputer PC                NULL
2   Wieża stereo               NULL
3   Smartphone                 NULL
4   Karta graficzna            1
5   Słuchawka bluetooth        3
6   Telewizor                  NULL
7   Dysk twardy                1
8   Kabel SATA do dysku        7



I teraz chcę sprawdzić sprzęty powiązane z ID 1 czyli z "Komputer PC".
W takim wypadku zrobiłbym zapytanie

  1. SELECT * FROM rtv WHERE powiazanie = 1


To zwróciło by mi:
Kod
4   Karta graficzna              1
7   Dysk twardy                  1


Ja jednak chciałbym sprawdzić poziom niżej, a więc by zwróciło by mi również sprzęty powiązane z tymi powiązanymi, czyli "Kabel SATA" który jest powiązany z "Dysk Twardy" który jest powiązany z wyszukiwanym "Komputer PC". Wystarczy mi tylko ten jeden "poziom" niżej, nie chcę szukać powiązań w nieskończoność. Dla uproszczenia powiązanie zawiera tylko jeden numer, więc słuchawki nie mogą np. należeć do Smartphona i Komputera jednocześnie.

Powinno zwrócić:
Kod
4   Karta graficzna              1
7   Dysk twardy                  1
8   Kabel SATA do dysku          7



Da się to zrobić jakoś sensownie na jednym zapytaniu?

Myślałem aby pobrać pierwsze powiązania tym zapytaniem które podałem, a potem w pętlę PHP dać te same zapytania dla tych powiązanych. To jednak się chyba nie sprawdzi bo po pierwsze zwiększy to mocno liczbę zapytań, a co ważniejsze nie będę mógł zrobić paginacji itd.

Jakieś rady?
com
zrobić z tego relacyjna bazę danych a nie takiego dziwne twora. Klucze robi się w rożnych tabelach a nie wszystko w jednej.
nyfko
Cytat(com @ 8.05.2016, 13:20:42 ) *
zrobić z tego relacyjna bazę danych a nie takiego dziwne twora. Klucze robi się w rożnych tabelach a nie wszystko w jednej.



To tylko był przykład, bo tak było łatwiej to wytłumaczyć niżeli przedstawiać wszystko. A nawet i tak nie mogło by to wtedy działać na różnych tabelach, bo czy np. sklepy trzymają w osobnych bazach telefony, a w osobnych kable do nich?

Po za tym cała baza i skrypty do niej nie są mojego autorstwa. Ja chcę tylko zrobić sprawdzanie tych numerków, lepiej niż robić ogromną ilość zapytań.
com
no ale nie uzyskasz odpowiedzi jak przedstawiasz zupełnie inny problem niż masz, bo coś co działa dla tego nie zadziała dla innej bazy.

I tak trzyma się w rożnych tabelach, ale to zależy od systemu, czasem pomimo redundancji stosuje się nadmiarowość aby szybciej wyszukiwać, a czasem nie.

CuteOne, problem w tym że ta baza wcale tak nie wygląda biggrin.gif
CuteOne
Dać się da smile.gif ale wymaga, to zmiany struktury bazy danych na:

tabela sprzet
id | nazwa
1 Dysk SSD
2 Kabel SATA
3 Karta graficzna

tabela sprzet_zestawy
id | node | sprzet_id | parent_id | depth
1 1 1 NULL 1
2 1 2 1 2
3 1 3 2 3

  1. SELECT * FROM sprzet_zestawy sp JOIN sprzet s ON (s.sprzet_id = sp.id) WHERE node = 1
nyfko
Cytat(com @ 8.05.2016, 14:30:42 ) *
no ale nie uzyskasz odpowiedzi jak przedstawiasz zupełnie inny problem niż masz, bo coś co działa dla tego nie zadziała dla innej bazy.

I tak trzyma się w rożnych tabelach, ale to zależy od systemu, czasem pomimo redundancji stosuje się nadmiarowość aby szybciej wyszukiwać, a czasem nie.

CuteOne, problem w tym że ta baza wcale tak nie wygląda biggrin.gif


Ale przedstawiłem problem. Tak jak mówiłem, nie mogę robić sobie osobnych tabel. Pytałem się tylko czy mogę pętlę w PHP z tym samym zapytaniem zastąpić jakoś w SQL pojedynczym zapytaniem. Jeśli się nie da, to wystarczy powiedzieć wink.gif Nie chcę szukać najlepszych rozwiązań dla sklepu internetowego, bo nie o to chodzi, to był tylko konkretny przykład i pytałem o zapytanie NA TYM konkretnym przykładzie z konkretną strukturą tabeli.
com
no jeśli masz tak zbudowaną tabele jak przedstawiłeś to wydałeś pieniądze w błoto na ten skrypt, bo to jest po pierwsze źle zaprojektowane, co prowadzi do tego iż nie mozliwe jest właściwe uzyskanie tego co powinieneś uzyskać, czyli wykonanie takiego zapytania jakie chciałeś.

możesz zrobić z tym to co sugerował CuteOne
nyfko
Ok to zapytam inaczej.

Czy da się zrobić tak by w zapytaniu z IN np:

  1. SELECT * FROM Customers WHERE City IN ('Paris','London');


Paris i London były wynikami innego zapytania a nie podanymi na sztywno (bez relacyjnych baz danych..). A więc by to co w nawiasie było Selectem, bez PHP?
com
owszem da sie zrobić podzapytanie ale czasem lepiej użyć joina wink.gif

przykład
http://stackoverflow.com/questions/6315511...-in-codeigniter
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.