Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tabela podrzędna w innej tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
Riggs
Witam!
Problem tak jak w temacie. Muszę zaprojektować kilka takich relacji, mam nawet pomysł ale niestety nie działa tak jakbym chciał. Przechodząc do konkretów:

Tabela KOMPUTERY
id - auto increment z id komputera;
nazwa - wiadomo
lista_oprogramowania - z tym jest problem.

Tabela OPROGRAMOWANIE
id - id - auto increment z id oprogramowania;
nazwa - wiadomo

Tabele są mocno uproszczone.
Teraz problem. W tabeli komputery mam pole lista_oprogramowania. Ma to być pole typu tabela
podrzedna (1:N). Mam problem z zamodelowaniem tego. Myślałem o stworzeniu tabeli pomocniczej komputery_oprogramowania która miałaby następujące pola:
id - do numerowania wierszy;
kid - id kompa;
sid - id oprogramowania.
Tylko nie wiem jak to powiązać z polem lista_oprogramowania, tak by przy przeglądaniu rekordów wyświetlana była lista zainstalowanego softu a nie jakiś dziwny identyfikator.

Z góry dzięki za wszelką pomoc.

PS. Myślałem jeszcze o tym żeby dla każdego komputera stworzyć osobną tabelę, w polu lista_oprogramownaia przechowywać jej nazwę i wykonywać select *. Jednak wydaje mi się to za mało optymalne rozwiązanie.
Tibod
Pomysł z trzecią tabelą komputery_oprogramowania będzie chyba najoptymalniejszy. A do wyciągnięcia danych wystarczy JOIN
Riggs
A czy za pomocą JOIN wrzucę wynik do pola lista_oprogramowania? Jakiego typu powinno być to pole. Najlepszy byłby link do jakiegoś przykładu żeby można było prześledzić działanie.
Tibod
Sory, nie doczytałem się. Nie potrzebujesz pola lista_oprogramowania

Przykładowe dane:
  1. -- phpMyAdmin SQL Dump
  2. -- version 2.10.1
  3. --
  4. -- Host: localhost:3306
  5. -- Czas wygenerowania: 16 Cze 2007, 15:45
  6. -- Wersja serwera: 5.0.41
  7. -- Wersja PHP: 5.2.2
  8.  
  9. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  10.  
  11. --
  12. -- Baza danych: `test`
  13. --
  14.  
  15. -- --------------------------------------------------------
  16.  
  17. --
  18. -- Struktura tabeli dla `komputery`
  19. --
  20.  
  21. CREATE TABLE `komputery` (
  22. `id` int(11) NOT NULL AUTO_INCREMENT,
  23. `nazwa` varchar(20) NOT NULL,
  24. PRIMARY KEY (`id`)
  25. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
  26.  
  27. --
  28. -- Zrzut danych tabeli `komputery`
  29. --
  30.  
  31. INSERT INTO `komputery` (`id`, `nazwa`) VALUES
  32. (1, 'Marka'),
  33. (2, 'Franka');
  34.  
  35. -- --------------------------------------------------------
  36.  
  37. --
  38. -- Struktura tabeli dla `komputery_oprogramowanie`
  39. --
  40.  
  41. CREATE TABLE `komputery_oprogramowanie` (
  42. `id` int(11) NOT NULL AUTO_INCREMENT,
  43. `kid` int(11) NOT NULL,
  44. `sid` int(11) NOT NULL,
  45. PRIMARY KEY (`id`)
  46. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
  47.  
  48. --
  49. -- Zrzut danych tabeli `komputery_oprogramowanie`
  50. --
  51.  
  52. INSERT INTO `komputery_oprogramowanie` (`id`, `kid`, `sid`) VALUES
  53. (1, 1, 1),
  54. (2, 1, 3),
  55. (3, 1, 5),
  56. (4, 2, 3),
  57. (5, 2, 4),
  58. (6, 2, 5),
  59. (7, 2, 6);
  60.  
  61. -- --------------------------------------------------------
  62.  
  63. --
  64. -- Struktura tabeli dla `oprogramowanie`
  65. --
  66.  
  67. CREATE TABLE `oprogramowanie` (
  68. `id` int(11) NOT NULL AUTO_INCREMENT,
  69. `nazwa` varchar(30) NOT NULL,
  70. PRIMARY KEY (`id`)
  71. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
  72.  
  73. --
  74. -- Zrzut danych tabeli `oprogramowanie`
  75. --
  76.  
  77. INSERT INTO `oprogramowanie` (`id`, `nazwa`) VALUES
  78. (1, 'Windows Vista'),
  79. (2, 'Windows XP'),
  80. (3, 'WinAmp'),
  81. (4, 'Nero'),
  82. (5, 'Office'),
  83. (6, 'Firefox');


Dane wyciągasz takim zapytaniem:
  1. SELECT komputery.nazwa, oprogramowanie.nazwa FROM komputery_oprogramowanie JOIN komputery ON komputery.id=kid JOIN oprogramowanie ON oprogramowanie.id=sid ORDER BY kid
Riggs
Wielkie dzięki, o coś takiego mi chodziło. Teraz tylko muszę odpowiednio zaprojektować stronkę raportującą i będzie ok.
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.