![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 29.07.2014 Ostrzeżenie: (0%) ![]() ![]() |
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
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? Ten post edytował nyfko 8.05.2016, 13:20:57 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 3 034 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
zrobić z tego relacyjna bazę danych a nie takiego dziwne twora. Klucze robi się w rożnych tabelach a nie wszystko w jednej.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 29.07.2014 Ostrzeżenie: (0%) ![]() ![]() |
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ń. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 3 034 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() Ten post edytował com 8.05.2016, 13:41:02 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Dać się da
![]() 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
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 29.07.2014 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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ć ![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 3 034 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 29.07.2014 Ostrzeżenie: (0%) ![]() ![]() |
Ok to zapytam inaczej.
Czy da się zrobić tak by w zapytaniu z IN np:
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? Ten post edytował nyfko 8.05.2016, 13:56:48 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 3 034 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
owszem da sie zrobić podzapytanie ale czasem lepiej użyć joina
![]() przykład http://stackoverflow.com/questions/6315511...-in-codeigniter |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.06.2025 - 09:01 |