Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] problem ze stworzeniem zapytania (relacje)
Forum PHP.pl > Forum > Przedszkole
lnn
Mam taką oto bazę danych jak na zdjęciu.

Spis wpisów danego uzytkownika wczytuje odczytując id w sesji jaki sie zalogowal: user_id = $_SESSION['id']
Wtedy wczytują mi się wszystkie wpisy danego użytkownika (z tabeli spis), ponieważ stworzyłem relacje, która zapisuje w tabeli jaki jest id usera ktory go zapisał. Natomiast w dane1,2,3,4 zapisuje sie id spisu oraz id uzytkownika ktory je dodal.

I teraz pytanie, chcialbym zrobic link w spisie
tzn zeby poprzez id ze spisu odczytalo mi dane z tabeli dane1, dane2, dane3, dane4

Jak stworzyć takie zapytanie?? Wiem, ze to bedzie jakies relacyjne, lecz wyskakuja mi przerozne bledy przy wywolaniu mysql_error(),
prosze o naprowadzenie na dobra sciezke ;-) z gory dzieki


Fifi209
To chyba zadanie dla left join przynajmniej mi się tak wydaje. winksmiley.jpg

Swoją drogą pokaż jak sam próbowałeś.
lnn
o w koncu cos zatrybilo smile.gif

  1. $result = mysql_query("SELECT dane1.nazwa FROM dane1 LEFT JOIN users ON dane1.user_id = users.id WHERE users.id ='".$_SESSION['id']."'");
  2. while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
  3. echo $row[0].'<br/>';
  4. }


1. pytanie to: jak pobrac np z tabeli dane1 wiecej pol niz tylko jedno nazwa?
2. pyt. to czy da sie pobrac pozostale dane z tabel dane2,3,4 w jednym zapytaniu? <mysli>
Fifi209
Ja Ci pokażę, ja miałem coś takiego:
  1. SELECT `news`.`id`, `news`.`subject`, `news`.`content`, `news`.`time`, `users`.`name`, count(`comments`.`id`) AS `count`
  2. FROM `news`
  3. LEFT JOIN `users` ON(`news`.`author_id` = `users`.`id`)
  4. LEFT JOIN `comments` ON(`news`.`id` = `comments`.`news_id`)
  5. GROUP BY `news`.`id`
  6. ORDER BY `news`.`time` DESC
  7. LIMIT 5


Pobierał komentarze do tego po news.author_id wybierał users.name winksmiley.jpg Chodzi mi o sam przykład jak połączyć. winksmiley.jpg
cojack
Lubie to, lecimy dla postgresql:

  1. CREATE VIEW "getAllUserData" AS
  2. SELECT
  3. "d1".*
  4. "d2".*
  5. "d3".*
  6. "d4".*
  7. "spis".*
  8. FROM
  9. "spis"
  10. LEFT JOIN
  11. "dane1" AS "d1"
  12. ON
  13. ( "spis"."user_id" = "d1"."user_id" )
  14. LEFT JOIN
  15. "dane2" AS "d2"
  16. ON
  17. ( "spis"."user_id" = "d2"."user_id" )
  18. LEFT JOIN
  19. "dane3" AS "d3"
  20. ON
  21. ( "spis"."user_id" = "d3"."user_id" )
  22. LEFT JOIN
  23. "dane4" AS "d4"
  24. ON
  25. ( "spis"."user_id" = "d4"."user_id" );


Teraz tak, ten widok nie będzie działał iż aczkolwiek ponieważ są zduplikowane nazwy kolumn (user_id itd) muszą być unikatowe, więc tam gdzie jest select musisz wyszczególnić nazwy kolumn które chcesz pobrać i/lub dodać aliasy.

Można jeszcze dodać left joina na tabele user jeżeli nie masz fkeyi.
lnn
Cytat(cojack @ 1.02.2010, 23:48:19 ) *
Teraz tak, ten widok nie będzie działał iż aczkolwiek ponieważ są zduplikowane nazwy kolumn (user_id itd) muszą być unikatowe, więc tam gdzie jest select musisz wyszczególnić nazwy kolumn które chcesz pobrać i/lub dodać aliasy.
Można jeszcze dodać left joina na tabele user jeżeli nie masz fkeyi.

hmm z tym ze to jest mysql...
a co do unikatowych nazw kolumn, to czy relacje tak mozna tworzyc zeby byly rozne nazwy w tabelach dla relacji?
nr d1 - user_id1, d2 - user_id2, d3 - user_id3 questionmark.gif

moze zle baze zaprojektowalem? :/
EDIT:

nie da sie zrobic tak ze:
klikam na nazwe ze spisu, przechodzi mi i wyciaga z:
dane1, dane2, dane3, dane4 - wszystkie wartosci po spis_id i user_id?
cojack
Baza jest poko, dodaj primary key i foreign key i będzie szybciej śmigało zapytanie. Skopiuj wszystko od select w dól i będzie działać pod mysql, a bynajmniej powinno. To jest czysty Ansi sql.



Tylko sobie klauzule where dodaj winksmiley.jpg

@edit
dobranoc, jak coś to do jutra jak dojdę do pracy.
lnn
  1. $result = mysql_query("SELECT
  2. d1.*,
  3. d2.*,
  4. d3.*,
  5. d4.*,
  6. spis.*
  7. FROM
  8. spis
  9. LEFT JOIN
  10. dane1 AS d1
  11. ON
  12. ( spis.user_id = d1.user_id1 )
  13. LEFT JOIN
  14. dane2 AS d2
  15. ON
  16. ( spis.user_id = d2.user_id2 )
  17. LEFT JOIN
  18. dane3 AS d3
  19. ON
  20. ( spis.user_id = d3.user_id3 )
  21. LEFT JOIN
  22. dane4 AS d4
  23. ON
  24. ( spis.user_id = d4.user_id4 )
  25. WHERE
  26. user_id = '".$_SESSION['id']."' ");
  27.  
  28.  
  29. while ($wyswietl = mysql_fetch_array($result)) {
  30. echo $wyswietl['wyposazenie'].'<br />';
  31. }


efekt? nie taki za bardzo jakbym chcial (ilosc rekordow liczaca setki) :/ wie ktos co jest grane?

cojack
W klauzulach ON dodaj sobie jeszcze dla każdego

przykład dla pierwszego:
  1. ON
  2. ( "spis"."user_id" = "d1"."user_id" AND "spis"."id" = "d1"."spis_id" )


Wtedy musisz też podać id_spis, zresztą nie wytłumaczyłeś dokładnie co Ty chcesz uzyskać, nie wiadomo czym jest spis, nazwy tabel też niczego nie reprezentują.

Skąd tyle wyników? Już Ci tłumaczę, te zapytanie pobiera, dosłownie WSZYSTKIE rekordy z pięciu tabel dotyczące użytkownika o podanym user_id. Robi to składnia

  1. "d1".* -- gwiazdka oznacza wszystkie kolumny
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.