Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z tabelą łączącą lub zapytaniem
Forum PHP.pl > Forum > Przedszkole
redelek
Witam,

Poprawiam swoją aplikacyjkę i napotkałem na problem. Chciałbym zrobić coś takiego , że jeśli użytkownik należy do danej rodziny to widzi dane, jeśli nie to widzi tylko swoją rodzinę lub rodzinę do której należy.
Troszkę zakręcone ale tak to wygląda

1. Tabela główna

id id_users id_family dane1 dane2 dane3 dane4
1 1 1212 fdss fdsdf fsdfs fsdfs
2 2 1212 dfsfs fdsfds fsdfds fdsfds
3 3 1214 fsdfs fsfsd fsdfs fsdfds
4 4 1215 fdsfsd fdsfds fdsfds fdsfds

2. Tabela users

id name lastname email password
1 piotr jankowski p.jankowski@wp.pl dffsdfsd
2 ania jankowska a.jankowska@wp.pl cdsfsdfsd
3 sabina coś s.cos@wp.pl fdsfsdf
4 natalia ktoś n.ktos@wp.pl fdsfsdfsd

3. Tabela łącząca family

id id_users id_family real_name family_default
1 1 1212 Jankowscy 1
2 2 1212 Jankowscy 1
3 2 1214 COŚ 0
4 2 1215 KTOŚ 0
5 3 1214 COŚ 1
6 4 1215 KTOŚ 1
7 1 1214 COŚ 0
8 4 1214 COŚ 0

Wynik jaki chciałbym otrzymać po zalogowaniu użytkownika piotr z id=1 to dane z tabeli głównej 1

id id_users id_family dane1 dane2 dane3 dane4
1 1 1212 fdss fdsdf fsdfs fsdfs
2 2 1212 dfsfs fdsfds fsdfds fdsfds
3 3 1214 fsdfs fsfsd fsdfs fsdfds

i tak dalej dla róznych użytkowników. Kombinuję jak koń pod górę z zapytaniami i nic sad.gif ostatnie jakie wymyśliłem to
  1. $wynik = mysql_query("SELECT * FROM $T_GIFT
  2. LEFT JOIN $T_USER ON $T_GIFT.id_u_name=$T_USER.id_users
  3. LEFT JOIN $T_FAMYLI ON $T_USER.id_users=$T_FAMYLI.u_id_users
  4. WHERE id_user_booking='0' AND purchased_gift='0' ORDER BY id_gift DESC") or die ("oooo.... GIFT<br />".mysql_error());


Może jeszcze czegoś mi w tabelach brakuje ? sad.gif Proszę o wyrozumiałość, nie zarabiam na tym robię to dla siebie

Dzięki
Redelek
mortus
Przeczytaj kolego drugie zdanie, które napisałeś i zauważ, że początek przeczy końcowi. Na pierwszy rzut oka to coś przedobrzyłeś z budową bazy danych (za dużo powtarzających się informacji, a i podejście podejrzewam nie do końca słuszne). Niemniej może wystarczy coś takiego:
  1. SELECT * FROM `tabela_glowna` WHERE `id_family` = (SELECT `id_family` FROM `tabela_glowna` WHERE `id_user` = 1);

Tyle, że tak jak pisałem, za dużo danych się powtarza, a w związku z tym powyższe zapytanie może nie być dobrym rozwiązaniem. Jak dla mnie baza danych jest do przerobienia.
redelek

Dodałem tą pre_famyli , tak by ograniczyć wyświetlanie dla róźnych rodzin i pole id_family w tabeli pre_gifts

  1. CREATE TABLE IF NOT EXISTS `pre_famyli` (
  2. `id_famyli` tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `u_id_users` tinyint(3) DEFAULT '0' COMMENT 'id uzytkownika',
  4. `u_family_code` varchar(4) COLLATE utf8_polish_ci DEFAULT '0' COMMENT 'kod rodziny wygenerowany podczas rejestracji',
  5. `u_real_name_family` varchar(200) COLLATE utf8_polish_ci DEFAULT NULL COMMENT 'prawdziwa nazwa rodziny',
  6. `u_family_def` varchar(1) COLLATE utf8_polish_ci DEFAULT '2' COMMENT 'glowna_rodzina',
  7. PRIMARY KEY (`id_famyli`),
  8. UNIQUE KEY `id_famyli` (`id_famyli`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=9 ;
  10.  
  11. -- --------------------------------------------------------
  12.  
  13. --
  14. -- Struktura tabeli dla tabeli `pre_gifts`
  15. --
  16.  
  17. CREATE TABLE IF NOT EXISTS `pre_gifts` (
  18. `id_gift` tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  19. `id_u_name` tinyint(3) DEFAULT '0',
  20. `id_user_booking` tinyint(3) DEFAULT '0',
  21. `id_family` varchar(4) COLLATE utf8_polish_ci DEFAULT NULL,
  22. `small_description` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL,
  23. `purchase_costs` int(10) DEFAULT NULL,
  24. `more_information` text COLLATE utf8_polish_ci,
  25. `links` varchar(255) COLLATE utf8_polish_ci DEFAULT NULL,
  26. `mini_photography` varchar(255) COLLATE utf8_polish_ci DEFAULT 'foto_dir/noimage.png',
  27. `purchased_gift` varchar(1) COLLATE utf8_polish_ci DEFAULT NULL,
  28. `opportunity_to_present` varchar(25) COLLATE utf8_polish_ci DEFAULT 'prezent',
  29. `date_added` date DEFAULT NULL,
  30. `date_execution` date DEFAULT '0000-00-00',
  31. PRIMARY KEY (`id_gift`),
  32. UNIQUE KEY `id_gift` (`id_gift`)
  33. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=5 ;
  34.  
  35. -- --------------------------------------------------------
  36.  
  37. --
  38. -- Struktura tabeli dla tabeli `pre_userconf`
  39. --
  40.  
  41. CREATE TABLE IF NOT EXISTS `pre_userconf` (
  42. `id_userconf` tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  43. `u_id_userconf` tinyint(3) DEFAULT '0',
  44. `u_registration_date` datetime DEFAULT NULL COMMENT 'data rejestracji uzytkownika',
  45. `u_date_of_last_login` datetime DEFAULT NULL COMMENT 'data ostatniego logowania',
  46. `u_lock_account` varchar(1) COLLATE utf8_polish_ci DEFAULT NULL COMMENT 'blokada konta uzytkownika',
  47. `u_user_rights` varchar(1) COLLATE utf8_polish_ci DEFAULT NULL COMMENT 'uprawnienia dla uzytkowników',
  48. `u_avatar` blob COMMENT 'obrazek uzytkownika',
  49. PRIMARY KEY (`id_userconf`),
  50. UNIQUE KEY `id_userconf` (`id_userconf`)
  51. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=5 ;
  52.  
  53. -- --------------------------------------------------------
  54.  
  55. --
  56. -- Struktura tabeli dla tabeli `pre_users`
  57. --
  58.  
  59. CREATE TABLE IF NOT EXISTS `pre_users` (
  60. `id_users` tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  61. `u_name` varchar(20) COLLATE utf8_polish_ci DEFAULT NULL COMMENT 'imie uzytkownika',
  62. `u_lastname` varchar(20) COLLATE utf8_polish_ci DEFAULT NULL COMMENT 'nazwisko uzytkownika',
  63. `u_email` varchar(50) COLLATE utf8_polish_ci DEFAULT NULL COMMENT 'email uzytkownika',
  64. `u_passwords` varchar(32) COLLATE utf8_polish_ci DEFAULT NULL COMMENT 'hasło uzytkownika',
  65. PRIMARY KEY (`id_users`),
  66. UNIQUE KEY `id_users` (`id_users`)
  67. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=5 ;


Zrobiłem twoje zapytanie , ale problem w tym, że jeden uzytkownik może należeć do wielu rodzin. Jeśli należy do wielu to zapytanie się wywala

#1242 - Subquery returns more than 1 row

  1. $wynik2 = mysql_query("SELECT * FROM $T_GIFT WHERE `id_family` = (SELECT `u_family_code` FROM $T_FAMYLI WHERE `u_id_users` = '1') AND `id_user_booking`='0'") or die ("klops2...<br /><br />".mysql_error());


help
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.