Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie tabel - problem z JOIN-ami
Forum PHP.pl > Forum > Bazy danych > MySQL
tomaszek83
Witam, mam takie tabele:
  1. CREATE TABLE IF NOT EXISTS `e327t_bl_players` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `first_name` varchar(255) NOT NULL DEFAULT '',
  4. `last_name` varchar(255) NOT NULL DEFAULT '',
  5. `nick` varchar(255) NOT NULL DEFAULT '',
  6. `about` text NOT NULL,
  7. `position_id` int(11) NOT NULL DEFAULT '0',
  8. `def_img` int(11) NOT NULL DEFAULT '0',
  9. `team_id` int(11) NOT NULL DEFAULT '0',
  10. `usr_id` int(11) NOT NULL DEFAULT '0',
  11. `country_id` int(11) NOT NULL DEFAULT '0',
  12. `registered` char(1) NOT NULL DEFAULT '0',
  13. `created_by` int(11) NOT NULL DEFAULT '0',
  14. PRIMARY KEY (`id`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=53 ; / Tabela definiuje zawodników /
  16.  
  17. INSERT INTO `e327t_bl_players` (`id`, `first_name`, `last_name`, `nick`, `about`, `position_id`, `def_img`, `team_id`, `usr_id`, `country_id`, `registered`, `created_by`) VALUES
  18. (1, 'Daniel', 'Danielski', '', '', 5, 0, 14, 0, 176, '0', 0),
  19. (2, 'Filip', 'Kowalski', '', '', 5, 0, 14, 0, 176, '0', 0),
  20. (3, 'Przemysław', 'Nowak', '', '', 4, 0, 14, 0, 176, '0', 0);
  21.  
  22. CREATE TABLE IF NOT EXISTS `e327t_bl_extra_filds` (
  23. `id` int(11) NOT NULL AUTO_INCREMENT,
  24. `name` varchar(255) NOT NULL DEFAULT '',
  25. `published` char(1) NOT NULL DEFAULT '1',
  26. `type` char(1) NOT NULL DEFAULT '0',
  27. `ordering` int(11) NOT NULL DEFAULT '0',
  28. `e_table_view` char(1) NOT NULL DEFAULT '0',
  29. `field_type` char(1) NOT NULL DEFAULT '0',
  30. `reg_exist` char(1) NOT NULL DEFAULT '0',
  31. `reg_require` char(1) NOT NULL DEFAULT '0',
  32. `fdisplay` char(1) NOT NULL DEFAULT '1',
  33. `season_related` varchar(1) NOT NULL DEFAULT '0',
  34. `faccess` varchar(1) NOT NULL DEFAULT '0',
  35. PRIMARY KEY (`id`)
  36. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ; / Tabela zawiera nazwy cech opisujących zawodnika /
  37.  
  38. INSERT INTO `e327t_bl_extra_filds` (`id`, `name`, `published`, `type`, `ordering`, `e_table_view`, `field_type`, `reg_exist`, `reg_require`, `fdisplay`, `season_related`, `faccess`) VALUES
  39. (1, 'Data urodzenia', '1', '0', 4, '0', '0', '0', '0', '1', '0', '0'),
  40. (2, 'Wzrost / Waga', '1', '0', 6, '0', '0', '0', '0', '1', '0', '0'),
  41. (3, 'Poprzedni klub', '1', '0', 7, '0', '0', '0', '0', '1', '0', '0'),
  42. (4, 'Miejsce urodzenia', '1', '0', 5, '0', '0', '0', '0', '1', '0', '0'),
  43. (5, 'Pozycja', '1', '0', 1, '1', '3', '0', '0', '1', '0', '0'),
  44. (6, 'Kadra pierwszego zespołu', '0', '0', 2, '0', '1', '0', '0', '1', '0', '0'),
  45. (7, 'Numer na koszulce', '1', '0', 3, '0', '0', '0', '0', '1', '0', '0');
  46.  
  47.  
  48. CREATE TABLE IF NOT EXISTS `e327t_bl_extra_values` (
  49. `f_id` int(11) NOT NULL DEFAULT '0',
  50. `uid` int(11) NOT NULL DEFAULT '0',
  51. `fvalue` varchar(255) NOT NULL DEFAULT '',
  52. `fvalue_text` text NOT NULL,
  53. `season_id` int(11) NOT NULL,
  54. PRIMARY KEY (`f_id`,`uid`,`season_id`),
  55. KEY `uid` (`uid`)
  56. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; / Tabela zawiera wartości cech opisujące zawodnika /
  57.  
  58. INSERT INTO `e327t_bl_extra_values` (`f_id`, `uid`, `fvalue`, `fvalue_text`, `season_id`) VALUES
  59. (1, 1, '18.12.1982 r.', '', 0),
  60. (1, 2, '04.09.1991 r.', '', 0),
  61. (1, 3, '15.12.1993 r.', '', 0),
  62. (2, 1, '184/83', '', 0),
  63. (2, 2, '185/72', '', 0),
  64. (2, 3, '180/66', '', 0),
  65. (3, 1, 'KS Pcimowo Wielkie', '', 0),
  66. (3, 2, 'Róża Staw', '', 0),
  67. (3, 3, 'SMS Łódź', '', 0),
  68. (4, 1, 'Ostrów Wlkp.', '', 0),
  69. (4, 2, 'Tomaszów Mazowiecki', '', 0),
  70. (4, 3, 'Wrocław', '', 0),
  71. (5, 1, '2', '', 0),
  72. (5, 2, '4', '', 0),
  73. (5, 3, '1', '', 0),
  74. (6, 1, '1', '', 0),
  75. (6, 2, '1', '', 0),
  76. (6, 3, '1', '', 0),
  77. (7, 1, '2', '', 0),
  78. (7, 2, '13', '', 0),
  79. (7, 3, '3', '', 0);
  80.  
  81.  
  82. CREATE TABLE IF NOT EXISTS `e327t_bl_extra_select` (
  83. `fid` int(11) NOT NULL DEFAULT '0',
  84. `sel_value` varchar(255) NOT NULL DEFAULT '',
  85. `id` int(11) NOT NULL AUTO_INCREMENT,
  86. `eordering` int(11) NOT NULL DEFAULT '0',
  87. PRIMARY KEY (`id`),
  88. KEY `fid` (`fid`)
  89. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; / Tabela zawiera wybór tych cech które są wybierane z listy /
  90.  
  91. INSERT INTO `e327t_bl_extra_select` (`fid`, `sel_value`, `id`, `eordering`) VALUES
  92. (5, 'Bramkarz', 1, 0),
  93. (5, 'Obrońca', 2, 1),
  94. (5, 'Pomocnik', 3, 2),
  95. (5, 'Napastnik', 4, 3);


Przy zapytaniu:
  1. SELECT
  2. e327t_bl_players.id,
  3. e327t_bl_players.first_name,
  4. e327t_bl_players.last_name,
  5. e327t_bl_extra_values.fvalue,
  6. e327t_bl_extra_select.sel_value
  7. FROM e327t_bl_players
  8. INNER JOIN e327t_bl_extra_values
  9. ON e327t_bl_players.id = e327t_bl_extra_values.uid
  10. INNER JOIN e327t_bl_extra_select
  11. ON e327t_bl_extra_values.fvalue = e327t_bl_extra_select.id
  12. WHERE e327t_bl_players.team_id = 14 AND e327t_bl_extra_values.f_id = 5


Otrzymuję wynik w postaci: Imię | Nazwisko | Pozycja
A chciałbym otrzymać: Imię | Nazwisko | Pozycja | Numer na koszulce |
Nie potrafię tak złączyć tabel aby odpowiednio powiązało rekordy. Zawsze otrzymuję dużo, za dużo rekordów w wyniku.
Proszę o pomoc, bo już opdam z sił.

Pozdrawiam
Tomek
Damonsson
A skąd ja mam wiedzieć które pole to numer na koszulce?


edit: Aaa już widzę, zaprojektuj to porządnie, bo za miesiąc nawet Ty się nie połapiesz co jest z czym powiązane i co z czego wynika.

  1. SELECT
  2.  
  3. e327t_bl_players.id,
  4.  
  5. e327t_bl_players.first_name,
  6.  
  7. e327t_bl_players.last_name,
  8.  
  9. e327t_bl_extra_values.fvalue AS Numer_Na_Koszulce
  10.  
  11. FROM e327t_bl_players
  12.  
  13. JOIN e327t_bl_extra_values ON e327t_bl_extra_values.uid = e327t_bl_players.id AND e327t_bl_extra_values.f_id = 7


o ile f_id = 7 to numer na koszulce.
tomaszek83
Numer na koszulce to pole o ID 7 (wynika z tabeli: e327t_bl_extra_filds). Jego wartości przechowywane są w tabeli: e327t_bl_extra_values. Wiersze o f_id = 7. W tejże tabeli przechowywane też są wartości innych cech (data urodzenia etc...).

Edit: Ja tego nie projektowałem, to jest komponent firmy trzeciej, za który zabuliłem a niestety support jest słaby (chyba przez to że to "makaroniarze" są autorami). Ja do tego rozszerzenia próbuję napisać moduł na własne potrzeby.

Edit2: Tak dobrze myślisz, tyle że ja potrzebuję mieć wartości o f_id = 5 oraz f_id = 7. Nie wiem czy to da się wyciągnąć korzystając tylko z SQL czy muszę do tego zaprzęgnąć PHP (no i jak?).
Damonsson
To współczuję, ale trudno się mówi, trzeba pracować na tym co się ma. Rozwiązanie powyżej jest ok?

  1. SELECT
  2.  
  3. e327t_bl_players.id,
  4.  
  5. e327t_bl_players.first_name,
  6.  
  7. e327t_bl_players.last_name,
  8.  
  9. x1.fvalue AS Numer_Na_Koszulce,
  10. e327t_bl_extra_select.sel_value AS Pozycja
  11.  
  12. FROM e327t_bl_players
  13.  
  14. JOIN e327t_bl_extra_values AS x1 ON x1.uid = e327t_bl_players.id AND x1.f_id = 7
  15.  
  16. JOIN e327t_bl_extra_values AS x2 ON x2.uid = e327t_bl_players.id AND x2.f_id = 5
  17.  
  18. JOIN e327t_bl_extra_select ON x2.fvalue = e327t_bl_extra_select.id


Nie wiem czy robienie duplikatu jest w miarę ok, ale działa.
tomaszek83
Kurcze, jesteś wielki! Dokładnie takie coś chciałem osiągnąć. Drugie rozwiązanie jest super. Nigdy bym na to nie wpadł. To pierwsze wyrzuca mi jedną wartość cechy (numer na koszulce). Duplikaty?!? Wow... nawet nie wiem co to jest, ale ważne że działa.

Pojedyńczą wartość cechy spokojnie sobie wyciagałem, ale żeby dwie w jedej tabeli to już nie dałem rady.

Pozdrawiam serdecznie.
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.