Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] problem ze stworzeniem zapytania (relacje)
lnn
post 1.02.2010, 23:11:24
Post #1





Grupa: Zarejestrowani
Postów: 361
Pomógł: 11
Dołączył: 17.12.2008
Skąd: LU

Ostrzeżenie: (0%)
-----


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




Ten post edytował lnn 1.02.2010, 23:15:06
Go to the top of the page
+Quote Post
Fifi209
post 1.02.2010, 23:17:37
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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

Swoją drogą pokaż jak sam próbowałeś.

Ten post edytował fifi209 1.02.2010, 23:17:50


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
lnn
post 1.02.2010, 23:29:24
Post #3





Grupa: Zarejestrowani
Postów: 361
Pomógł: 11
Dołączył: 17.12.2008
Skąd: LU

Ostrzeżenie: (0%)
-----


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>
Go to the top of the page
+Quote Post
Fifi209
post 1.02.2010, 23:34:01
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
cojack
post 1.02.2010, 23:48:19
Post #5





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.

Ten post edytował cojack 1.02.2010, 23:49:53


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
lnn
post 1.02.2010, 23:57:53
Post #6





Grupa: Zarejestrowani
Postów: 361
Pomógł: 11
Dołączył: 17.12.2008
Skąd: LU

Ostrzeżenie: (0%)
-----


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?

Ten post edytował lnn 2.02.2010, 00:06:33
Go to the top of the page
+Quote Post
cojack
post 2.02.2010, 00:03:30
Post #7





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.

Ten post edytował cojack 2.02.2010, 00:06:09


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
lnn
post 2.02.2010, 01:50:56
Post #8





Grupa: Zarejestrowani
Postów: 361
Pomógł: 11
Dołączył: 17.12.2008
Skąd: LU

Ostrzeżenie: (0%)
-----


  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?

Go to the top of the page
+Quote Post
cojack
post 2.02.2010, 08:18:29
Post #9





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.08.2025 - 23:52