![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 30.04.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Może ktoś z Państwa pomoże mi rozwiązać następujący problem.
Mamy 2 tabele tabela "test" ma następujące komórki id | nazwa | opis 1 | test | to jest test 2 | test 2 | to jest test 2 3 | ... | ... 4 | ... | ... tabela "nazwa" id | nazwa | wartości 1 | nazwa 1 | 1,2 2 | nazwa 2 | 1,4 3 | nazwa 3 | 1,4,2,3 jak zrobić zapytanie takie, że wybieram konkretny id z tabeli "nazwa" oraz wszystkie komórki z tabeli "test" które odpowiadają numeracji z tabeli "nazwa".wartości Ja poradziłęm sobie tak (w skrócie): select * from test; ... $t[ id ] = nazwa; select * from nazwa where id=5; ... $w = explode(',', $wartosc) for (...) echo $t[ ($w[$i]) ]; ale interesuje mnie bardziej profesjonalne podejście do tego problemu (może jest to możliwe zrobienie w jednym zapytaniu) Przy okazji ma ktoś jakieś ciekawe tutoriale to opisu zaawansowanych zapytań w mysql? Tak żeby były jeszcze opisane przykłady z użyciem IF, oraz @ (np. @val := if (...)). |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 856 Pomógł: 19 Dołączył: 30.08.2005 Skąd: 100lica Ostrzeżenie: (0%) ![]() ![]() |
Jak piszesz o profesionalizmie to może zastosuj inna konstrukcję:
rabela test id | nazwa | opis 1 | test | to jest test 2 | test 2 | to jest test 2 3 | ... | ... 4 | ... | ... tabela "nazwa" id | nazwa | wartości 1 | nazwa 1 | 1 1 | nazwa 1 | 2 2 | nazwa 2 | 4 2 | nazwa 2 | 1 3 | nazwa 3 | 1 3 | nazwa 3 | 4 3 | nazwa 3 | 2 3 | nazwa 3 | 3 a zapytanie
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 30.04.2006 Ostrzeżenie: (0%) ![]() ![]() |
Niestety nie mogę stworzyć takiej konstrukcji jak Pan proponuje, ponieważ, w tabeli "nazwa", komórka "wartość" może przyjać nawet do 100 wpisów i więcej. Sama komórka "wartość" przetrzymuje identyfikatory tabeli "test", gdzie po wybraniu danego zapytania będą wyświetlone opisy (mogą to być np. nazwy części samochodowych, składniki lub inne podobne rzeczy). A zatem bardziej racjonalne podejście (tak mi się wydaje) jest te które zaproponowałem.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 100 Pomógł: 1 Dołączył: 6.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Powinieneś zastosować jeszcze jedną tabelę np. 'nazwa_wartosci', która będzie przechowywać identyfikator z tabeli nazwa i wartości jako pojedyncze rekordy.
id_nazwa, id_test 1,1 1,2 2,1 2,4 3,1 3,4 3,2 3,3 Cytat jak zrobić zapytanie takie, że wybieram konkretny id z tabeli "nazwa" oraz wszystkie komórki z tabeli "test" które odpowiadają numeracji z tabeli "nazwa".wartości
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 30.04.2006 Ostrzeżenie: (0%) ![]() ![]() |
Wydaje się mi, że nie ma potrzeby tworzenia dodatkowej (trzeciej) tabeli. Dodam, że w tabeli "nazwa" komórki "wartość" mogą przyjmować różne i losowe wartości. To tak jakbyśmy mieli tabelę "samochody", a druga tabela to "części" i w tabeli "samochody" dodając nowy samochód, dodalibyśmy (w jednej komórce) numery identyfikacyjne wszystkich użytych części (a to wszystko w jednym rekordzie).
Sądzę, że można to uczynić na jednym zapytaniu - zapewne trzeba użyć "magicznych" sztuczek i pewnie jeszcze pętli w zapytaniu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Może któryś ze spacjalistów ma jakiś pomysł. ps. ja ciągle się uczę mysql tak więc będe wdzięczny jak ktoś podzieli się ciekawymi opisami bardzo zaawansowanych zapytań i "sztuczek" w mysql (może być np. w języku angielskim). |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 856 Pomógł: 19 Dołączył: 30.08.2005 Skąd: 100lica Ostrzeżenie: (0%) ![]() ![]() |
No to norbas i ja daliśmy Ci gotowe rozwiązanie, którego Ty nie chcesz wykorzystać tylko tworzyć własne cyrki, które tylko bardziej obciążą bazę i zwiększą czas oczekiwania a wynik i tak dosteniesz ten sam.
Takie są moje przemyślenia po tym co napisałeś. Sądzę że albo źle opisałeś problem albo nie rozumiesz odpowiedzi |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 30.04.2006 Ostrzeżenie: (0%) ![]() ![]() |
To może jeszcze inaczej.
Tabela 1 (T1) Kod id | nazwa 1 | Mleko 2 | Jajko 3 | Cukier ... (tutaj więcej rzeczy) Tabela 2 (T2) Kod id | nazwa | skladniki 1 | Przepis 1 | 1=1 szklanka;2=3 sztuki;3=2 łyżeczki i teraz chodzi o utworzenie odpowiedniego zapytania sql na tych dwóch tabelach, które będzie posiadać takie elementy aby przedstawi efekt w następującej formie: Kod Nazwa przepisu: Przepis 1
Składniki: Mleko: 1 szklanka Jajko: 3 sztuki Cukier: 2 łyżeczki |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 100 Pomógł: 1 Dołączył: 6.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ale jesteś uparty (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Nie powinno się robić takiej struktury bazy danych jaką podałeś - błąd już w fazie projektowania.
Jeśli chcesz tak zrobić, to musisz wyraźnie oddzielić od siebie składniki, aby wiedzieć gdzie zaczyna się kolejny identyfikator tabeli t1 (chyba, że będzie ich mniej niż 10). W przykładzie, który podałeś pole 'skladniki' może mieć postać: ';1=1 szklanka;2=3 sztuki;3=2 łyżeczki' (średnik na początku). Wtedy zapytanie można zbudować następująco:
Po wykonaniu zapytania otrzymasz 3 wiersze:
i musisz kolejno zamieniać w pętli ';identyfikator=' na t1.nazwa IMO to zupełnie nie ma sensu. Wyobraź sobie, że otrzymasz 100 wierszy (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#9
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Cytat Niestety nie mogę stworzyć takiej konstrukcji jak Pan proponuje,[...] Ale generalnie to strukture bazy mozesz zmienic? Cytat To tak jakbyśmy mieli tabelę "samochody", a druga tabela to "części" i w tabeli "samochody" dodając nowy samochód, dodalibyśmy (w jednej komórce) numery identyfikacyjne wszystkich użytych części (a to wszystko w jednym rekordzie). Mozesz podac konkretne nazwy tabel i opisac co chcesz zrobic, bo nazwy takie jak 'nazwa', 'test' nie ulatwiaja rozwiazania problemu. Przyklad z samochodami jest zrozumialy (ale nie wiem czy akurat tym sie zajmujesz). Jesli samochod sklada sie z wielu czesci, i kazda czesc moze byc uzywa w wielu roznych samochodach (np. te same kola; i nie mowie tu o tej samej instancji czesci, bo przeciez nie zbudujesz dwoch samochodow z czterech kol (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ) Jak to ma w bazie wygladac (juz ci o tym pisali) * Standardowa relacja wiele do wielu (+ agregacja (nie kompozycja)): * Tabele: Samochody ( id, nazwa , ...) Czesci ( id, nazwa, ...) Czesci_Samochody ( czesc_id, samochod_id ) -- umozliwi ci przypisanie wielu czesci do samochodow i umozliwi samochodowi skladanie sie z wielu czesci Cytat ps. ja ciągle się uczę mysql tak więc będe wdzięczny jak ktoś podzieli się ciekawymi opisami bardzo zaawansowanych zapytań i "sztuczek" w mysql (może być np. w języku angielskim). Zalecam poznanie najpierw podstaw projektowania baz danych. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 11:50 |