![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 0 Dołączył: 12.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Mam czysto teoretyczne pytanie.
Mam dwie tabele które opisuje poniżej: Pierwsza tabela składającą się z dwóch kolumn: id i kategoria. Id jest nadawane przez auto_increment natomiast w kolumnie o nazwie kategoria mieszczą się nazwy kategorii i jest ich dokładnie pięć. Tabela ta wygląda tak: 1. pierwszy kategoria 2. druga kategoria 3. trzecia kategoria 4. czwarta kategoria 5. piąta kategoria Druga tabela zawiera: id, kategoria, nazwa. Id jest nadawane przez auto_increment, kategoria to cyfra która ma nawiązywać do pierwszej tabeli i kolumna nazwa posiada nazwy produktów i przykładowo wygląda tak: 1. 3. nazwa_produktu Oznacza to, że pierwszy rekord o identyfikatorze nr. 1 to produkt o nazwie: nazwa_produktu i należy do kategorii 3 Problem w tym, że 'id' w pierwszej tabeli jest przez auto_increment dlatego też jak usunę wszystkie rekordy w pierwszej tabeli i utworze je na nowo? wtedy nie będzie żadnej kategorii o identyfikatorze 3 bo wtedy tabela pierwsza będzie wyglądała tak: 6. pierwszy kategoria 7. druga kategoria 8. trzecia kategoria 9. czwarta kategoria 10. piąta kategoria Pojawia się problem bo nagle wszystkie rekordy z drugiej tabeli stracą kategorie. I jak to pogodzić? Bo ja widzę tylko jedną opcję. Oprócz kolumny 'id' w pierwszej tabeli która ma auto_increment wstawić jeszcze jedną kolumnę o nazwie np. "numer_kategorii" i na sztywno wpisywać oprócz nazwy kategorii jej numer ale czy to jest dobre rozwiązanie? Ten post edytował Zagiewa 8.04.2010, 19:47:51 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 317 Pomógł: 58 Dołączył: 6.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
Do tego służą klucze obce. Używając ich możesz całą odpowiedzialność za zachowanie spójności danych zrzucić na silnik bazy.
-------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 0 Dołączył: 12.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Tak rozumiem, że są klucze główne i obce i u mnie powinno to wyglądać tak:
tabela pierwsza: kolumna 'id' powinna być kluczem głównym? tabela druga: kolumna 'id' powinna być kluczem głównym natomiast kolumna druga 'kategoria' powinna być kluczem obcym nawiązującym do tabeli 'id' tabeli pierwszej? Klucze główne mam nadane ale czy klucz obcy też się nadaje? Jeśli tak to jak mam to zrobić? I najważniejsze pytanie jak nadam klucz obcy to od tej pory w drugiej tabeli w kolumna 'kategoria' będzie się zmieniała w wraz ze zmianą wartości kolumny 'id' w tabeli pierwszej? |
|
|
![]()
Post
#4
|
|
![]() Newsman Grupa: Moderatorzy Postów: 4 005 Pomógł: 548 Dołączył: 7.04.2008 Skąd: Trzebinia/Kraków ![]() |
troszkę mylisz pojęcia. polecam poczytanie o kluczach obcych. jest to wymuszenie więzów integralności czyli w przykładzie:
w tabeli 1 mam id i nazwa teraz tabela 2 id, pod_nazwa, id_nazwa1 i mam klucz obcy założony na id_nazwa1 do pola id w tabeli 1, i teraz chąc usunąć coś w tabeli 1 która ma 'odnośnik' w tabeli 2 nie dam rady bo moja integralność nie będzie OK, bo miałem coś w tabli 1 co używała tabela 2 a już tego nie ma, FK zapobiega takim działaniom. polecam lekturę o Forgein Key. -------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 29 Dołączył: 20.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mniej więcej tak... Resztę doczytasz w manualu Ten post edytował Szeszek1992 8.04.2010, 20:49:00 -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 317 Pomógł: 58 Dołączył: 6.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
Koledzy już Ci trochę napisali, ja dodam jeszcze tylko odnośnie tego fragmentu:
I najważniejsze pytanie jak nadam klucz obcy to od tej pory w drugiej tabeli w kolumna 'kategoria' będzie się zmieniała w wraz ze zmianą wartości kolumny 'id' w tabeli pierwszej? Zastosuj a otrzymasz taki efekt, jakiego potrzebujesz. Wiesz już czego szukać, na pewno znajdziesz mnóstwo artykułów na ten temat. -------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 0 Dołączył: 12.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Klucze główne miałem nadane ale dzięki za info jak nadawać klucz obcy. Martwi mnie tylko kwestia braku możliwości usuwania rekordów z pierwszej tabeli ale to jest mało istotne bo nie sądzę aby było to konieczne. Prosił bym was o jeszcze jedną podpowiedź. Serwer który mam postawiony na kompie daje mi możliwość tworzenia baz i tabel za pomocą php ale na serwerze u mojego dostawcy hostingu jedyna możliwość tworzenia baz czy tabel jest dostępna tylko z poziomu phpmyadmin niestety :/ i chociaż jest do do przełknięcia to jak tam tworzy się klucz obcy?
Klucz główny (primary) tworzy się zaznaczając opcję: "podstawowy" przy kolumnie w tabeli a jak brzmi nazwa klucza obcego? PS. dzięki chłopaki i na pewno jeszcze o tym poczytam tym bardziej, że takie znaczniki/funkcje/opcje (jakkolwiek je nazwa) jak: FOREIGN KEY, REFERENCES kat(id) ON UPDATE RESTRICT ON DELETE RESTRICT, ON UPDATE CASCADE są mi kompletnie obce więc warto się dowiedzieć jak działają ![]() Ten post edytował Zagiewa 8.04.2010, 21:09:11 |
|
|
![]()
Post
#8
|
|
![]() Newsman Grupa: Moderatorzy Postów: 4 005 Pomógł: 548 Dołączył: 7.04.2008 Skąd: Trzebinia/Kraków ![]() |
Martwi mnie tylko kwestia braku możliwości usuwania rekordów z pierwszej tabeli ale to jest mało istotne bo nie sądzę aby było to konieczne. ale takie jest założenie baz danych. nic z nich nie ma być kasowane. Prosił bym was o jeszcze jedną podpowiedź. Serwer który mam postawiony na kompie daje mi możliwość tworzenia baz i tabel za pomocą php ale na serwerze u mojego dostawcy hostingu jedyna możliwość tworzenia baz czy tabel jest dostępna tylko z poziomu phpmyadmin niestety :/ i chociaż jest do do przełknięcia to jak tam tworzy się klucz obcy? musisz używać tabel typu InnoDB. poczytaj tu: http://dev.mysql.com/doc/refman/5.1/en/inn...onstraints.html -------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 117 Pomógł: 29 Dołączył: 20.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
W phpMyAdminie możesz dodawać tabele zapytaniem SQL w zakładce "Zapytanie przez przykład".
-------------------- |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 0 Dołączył: 12.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wielkie działa - chyba
![]() A właśnie przy okazji skorzystałem również z podpowiedzi piotrooo89 i zmieniłem nazwę kolumny 'kategoria' w drugiej tabeli na 'id_kategoria' ![]() Odświeżam temat bo jestem w trakcie pisania skryptu który odczytał by rekordy z połączenia moich dwóch tabel. Jak wyglądają tabele już wiecie. Poniżej przedstawiam kod, który dzięki waszej pomocy wyświetla kategorie:
Kod ten poprawnie wyświetla kategorie ale z jednej tabeli co nie jest problemem. Teraz potrzebuję odczytać rekordy z linkami z drugiej tabeli tak aby połączyć kolumnę 'id_kategoria' tabeli 2 z kolumną 'id' tabeli 1, a następnie wyświetlić linki z drugiej tabli tak aby każdy z nich znalazł się pod nazwą swojej kategorii ale to później. Na razie potrzebuje utworzyć połączenie które łączy dwie tabele i skleciłem coś takiego:
Problem w tym, że gdy ten kod wpiszę do powyższego skryptu i uruchomię stronę to znikają nazwy kategorii które wcześniej się wyświetlały. I teraz pytanie źle utworzyłem bazy (klucz obcy który pierwszy raz tworzyłem przez phpmyadmin) czy też próba połączenie tabel powoduje to zniknięcie? Ten post edytował piotrooo89 10.04.2010, 14:02:41
Powód edycji: [piotrooo89]: poprawiłem bbcode.
|
|
|
![]()
Post
#11
|
|
![]() Newsman Grupa: Moderatorzy Postów: 4 005 Pomógł: 548 Dołączył: 7.04.2008 Skąd: Trzebinia/Kraków ![]() |
proszę o używanie odpowiedniego bbcode.
-------------------- |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 0 Dołączył: 12.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Zgaduje, że za bardzo namotałem, że nie odpisujecie dlatego zadam pierwsze i na razie najważniejsze pytanie. Czy to zapytanie łączenia baz jest poprawne?
Pierwsza tabela wyglada tak: Kod id. kategoria 1. nazwa_kategorii Druga tabela wygląda tak: Kod id. id_kategorii. nazwa. adres 1. 1. przykladowa_nazwa. przykladowy_adres I za pomocą tego zapytania chcę odczytać dane z obu tabeli łącząc z tabeli drugiej kolumne 'id_kategoria' z kolumna 'id' tabeli pierwszej. I otrzymać taki wynik: Kod nazwa_kategoria
przykladowa_nazwa, przykladowy_adres
Powód edycji: [piotrooo89]: poprawiłem bbcode raz jeszcze.
|
|
|
![]()
Post
#13
|
|
![]() Newsman Grupa: Moderatorzy Postów: 4 005 Pomógł: 548 Dołączył: 7.04.2008 Skąd: Trzebinia/Kraków ![]() |
nie mam w zwyczaju prosić 2 razy. temat zamykam. otworzę gdy ja lub inny moderator dostaniem informacje jakie poprawne bbcode powinno być użyte.
Powód edycji: [piotrooo89]: otwieram zgodnie z zapewnieniem autora że będzie już używał odpowiednich bbcode.
-------------------- |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 0 Dołączył: 12.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Udało mi się chociaż nie wiem czy jest to dobry sposób na łączenie tabel ale na pewno skuteczny. Co prawda potrzebuję łączyć się z dwiema tabelami z osobna ale ważne, że działa. Całość wygląda tak:
Oczywiście wyświetla on jedynie przykładowe dane w przykładowy sposób aby tylko sprawdzić czy ten sposób łączenia tabel się uda no i udał się ![]() |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Hmm... Chyba coś robisz źle. Dlaczego? W tabeli linki masz różne odnośniki i każdy odnośnik należy do określonej kategorii. Rozumiem, że chcesz pobrać i wyświetlić wszystkie linki, które należą do danej kategorii. Ty tymczasem pobierasz wszystkie kategorie (zawsze będzie jedna), które odpowiadają kolejnym odnośnikom z tabeli linki. Wniosek - zła kolejność zapytań do bazy danych. Sam sposób jest dobry, choć nie jestem przekonany, czy najwydajniejszy.
Innym rozwiązaniem jest pobranie danych za pomocą jednego zapytania i umieszczenie ich w specjalnie spreparowanej tablicy. Później do wyświetlenia tych danych używamy właśnie tej tablicy, a nie wyników zapytania. Sposób ten opisał nospor. |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 0 Dołączył: 12.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Masz rację mortus będę chciał wyświetlić tylko te linki pod tą kategorią do której pasują i mój skrypt nie da mi takiej możliwości ale biorąc pod uwagę moją jeszcze ubogą znajomość języka ciężko mi uzyskać od razu konkretny wynik dlatego też skrypt mój podzieliłem na punkty i staram się je krok po kroku wykonywać. Obecnie udało mi się poprawnie zastosować pętle aby wyświetlić w oczekiwany sposób dane. Post z kodem który mi podałeś jest świetny i będę kilka kroków do przody - więc dzięki wielkie
![]() ![]() Więc tak. Wykorzystując kod z post który mi podałeś udał i mi się wyświetlić rekordy linków pod odpowiednimi kategoriami a to już dobrze ale kod ten wyświetla wyniki pionowo w formie wykazu <ul></ul> Potrzebuje teraz to przerobić na tabelę która będzie wyglądać tak: Kod kategoria1 kategoria2 kategoria3 kategoria4 kategoria5 a a a a a b b b b b c c c c c d d d d d e e e e e f f f f f Męczę się, już ledwo na oczy widzę i dalej bez powodzenia :/ ![]()
Rozwiązałem problem inaczej. Zamiast męczyć się z przerabianiem wykazu <ul></ul> na tabelę dodałem po prosty formatowanie float: left; dzięki czemu zamiast pionowo wykaz wyświetla się poziomo. Problem teraz inny - chcę aby wyświetlały się trzy kategorie (oczywiście pod nimi linki) następnie przejście do następnego wiersza i znów trzy kategorie. Podobny temat już poruszyłem ale oparty był na tabeli tutaj sytuacja inaczej wygląda. Jedyne rozwiązanie które mi przyszło do głowy to nadać wykazowi <ul> szerokość 600xp i każdej z kategorii szerokość 200px dzięki czemu w jednym wierszu może się wyświetlić tylko trzy kategorie po czym przechodzi do nowego wiersza i to działa pod warunkiem, że pod każdą z kategorii jest po tyle samo linków w przeciwnym wypadku robi się coś takiego: Kod kat1 kat2 kat3 a a a b b b c c kat4 d d a e b c kat5 a b c Macie jakiś pomysł jak to naprawić? Ten post edytował Zagiewa 13.04.2010, 02:29:01 |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Pokaż to co do tej pory zrobiłeś (wszystko), to będzie łatwiej coś wydedukować.
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 0 Dołączył: 12.08.2009 Ostrzeżenie: (0%) ![]() ![]() |
Tabele w wyglądają tak:
Kod który je szczytuje i wyświetla wygląda tak:
Krótkie wyjaśnienie - id="linki" nadaje formatowanie tekstowi jak kolor itp. co jest mało ważne i co najważniejsze ma szerokość 600px. Każdy <li> wyświetlający kategorię ma 200px po to aby w całym wykazie <ul> mieściło się tylko trzy kategorie w wierszu. Drugi wykaz <ul> dla linków który w moim kodzie wygląda tak: <ul style="margin-left: -40px;"> jest też nie bez powodu. Musiałem nadać ujemny margines aby przesunąć wyświetlane linki na równo w pionie z kategoriami. Co chcę osiągnąć już wiadomo - wyjaśniłem to myślę dość jasno w moim poprzednim poście w razie czego jeśli jest niezrozumiały mogę wyjaśniać w nieskończoność bo zależy mi aby ten kod działał tym bardziej, że nad całością się sporo napracowałem ![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 4.05.2025 - 08:17 |