Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Wyciągnięcie danych z 2 tabel
@rtur
post 5.05.2011, 17:40:18
Post #1





Grupa: Zarejestrowani
Postów: 254
Pomógł: 3
Dołączył: 23.02.2006

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


Witam mam takie tabele 2:
  1. CREATE TABLE `newsy` (
  2. `nid` int(11) NOT NULL AUTO_INCREMENT,
  3. `tytul` varchar(128) NOT NULL,
  4. `tresc` text NOT NULL,
  5. `autor_id` varchar(11) NOT NULL,
  6. PRIMARY KEY (`nid`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
  8.  
  9. CREATE TABLE `autorzy` (
  10. `aid` int(11) NOT NULL AUTO_INCREMENT,
  11. `login` varchar(128) NOT NULL,
  12. PRIMARY KEY (`aid`)
  13. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
  14.  
  15. INSERT INTO `newsy` VALUES(1, 'news 1', 'tresc 1 newsa','1');
  16. INSERT INTO `autorzy` VALUES(1, 'user 1');

Chciałbym teraz wyciągnąć i wyświetlić na stronie tytul, tresc, newsa o nid=1 z tabeli 'newsy' i login autora tego newsa który jest w tabeli 'autorzy', jak powinno wyglądać najbardziej optymalne zapytanie mysql żeby to pobrać?

Ten post edytował @rtur 5.05.2011, 17:41:13


--------------------
Artur
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
artekp999
post 5.05.2011, 18:02:04
Post #2





Grupa: Zarejestrowani
Postów: 118
Pomógł: 2
Dołączył: 25.02.2011

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


zrób w tabeli newsy rekord nick
do niego zapisuj nick z sesji
pozniej wyświetl rekord z bazy
Go to the top of the page
+Quote Post
Bags_Bunny
post 5.05.2011, 18:13:59
Post #3





Grupa: Zarejestrowani
Postów: 262
Pomógł: 39
Dołączył: 12.04.2004

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


  1. SELECT * FROM newsy LEFT JOIN autorzy ON autor_id=aid WHERE nid=1

Pisane z palca, ale powinno styknąć. Gdybyś miał zgodne nazwy kolumn z id, byłoby jeszcze prościej.


--------------------
rm -rf /*
Go to the top of the page
+Quote Post
mat-bi
post 5.05.2011, 18:15:28
Post #4





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

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


Bags_Bunny, nie zadziała - zly styl joinów
Go to the top of the page
+Quote Post
Bags_Bunny
post 5.05.2011, 18:18:16
Post #5





Grupa: Zarejestrowani
Postów: 262
Pomógł: 39
Dołączył: 12.04.2004

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


Nie mam pojęcia co to jest styl JOINów, ale u mnie działa.

--edit--
Tak sobie teraz jeszcze spojrzałem na zapytania i po jaką tandetę autor_id jest typu varchar?

Ten post edytował Bags_Bunny 5.05.2011, 18:19:40


--------------------
rm -rf /*
Go to the top of the page
+Quote Post
mat-bi
post 5.05.2011, 18:19:55
Post #6





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

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


chodzi mi o to, czy nie powinno być:

  1. SELECT * FROM newsy n LEFT JOIN autorzy a ON a.aid = n.autor_id


?
Go to the top of the page
+Quote Post
everth
post 5.05.2011, 18:21:13
Post #7





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


Kolumny są jednoznaczne - mogłoby być ale niekoniecznie musi.


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
Bags_Bunny
post 5.05.2011, 18:22:43
Post #8





Grupa: Zarejestrowani
Postów: 262
Pomógł: 39
Dołączył: 12.04.2004

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


Cytat(mat-bi @ 5.05.2011, 18:19:55 ) *
chodzi mi o to, czy nie powinno być:

Skoro nie wiesz jak powinno być, to dlaczego piszesz, że nie zadziała?
Jeśli kolumny są unikalne, to nie trzeba podawać nazwy tabeli, bo może być rozpoznana. Preferuję minimalizm.

Ten post edytował Bags_Bunny 5.05.2011, 18:23:12


--------------------
rm -rf /*
Go to the top of the page
+Quote Post
mat-bi
post 5.05.2011, 18:23:49
Post #9





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

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


Sorry, zawsze mi sie wydawało, że powinna być podana nazwa tabeli - ja preferuję całkowite wypisanie, nie trzeba się pote rozwlekać przy poprawkach
Go to the top of the page
+Quote Post
Bags_Bunny
post 5.05.2011, 18:26:08
Post #10





Grupa: Zarejestrowani
Postów: 262
Pomógł: 39
Dołączył: 12.04.2004

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


A ja nie używam ON wink.gif.


--------------------
rm -rf /*
Go to the top of the page
+Quote Post
@rtur
post 5.05.2011, 18:26:30
Post #11





Grupa: Zarejestrowani
Postów: 254
Pomógł: 3
Dołączył: 23.02.2006

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


Cytat(artekp999 @ 5.05.2011, 18:02:04 ) *
zrób w tabeli newsy rekord nick
do niego zapisuj nick z sesji
pozniej wyświetl rekord z bazy


To nie byłoby złe, już tak miałem przemyślane, dodałem kolumnę login i wpisywałem w niej login autora, ten z bazy autorzy ale co jak zmienię użytkownikowi login w bazie autorzy?


--------------------
Artur
Go to the top of the page
+Quote Post
Bags_Bunny
post 5.05.2011, 18:31:22
Post #12





Grupa: Zarejestrowani
Postów: 262
Pomógł: 39
Dołączył: 12.04.2004

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


Cytat(@rtur @ 5.05.2011, 18:26:30 ) *
co jak zmienię użytkownikowi login w bazie autorzy?

I właśnie z tego powodu tamto rozwiązanie jest złe. Redundancja, normalizacja. Warto zapoznać się z tym pojęciami.


--------------------
rm -rf /*
Go to the top of the page
+Quote Post
mat-bi
post 5.05.2011, 18:31:23
Post #13





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

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


Cytat(artekp999 @ 5.05.2011, 19:02:04 ) *
zrób w tabeli newsy rekord nick
do niego zapisuj nick z sesji
pozniej wyświetl rekord z bazy


Jedno z najgłupszych rzeczy, jakie można zrobić - na takich danych operuje się zwykle na id, a przy pomocy odpowiedniego zapytania pobiera się login - w końcu jest on zwykle zmienny wink.gif

Tak, jak używa się zwykle id w sesji, nie loginów
Go to the top of the page
+Quote Post
@rtur
post 5.05.2011, 19:00:55
Post #14





Grupa: Zarejestrowani
Postów: 254
Pomógł: 3
Dołączył: 23.02.2006

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


Cytat(Bags_Bunny @ 5.05.2011, 18:13:59 ) *
  1. SELECT * FROM newsy LEFT JOIN autorzy ON autor_id=aid WHERE nid=1

Pisane z palca, ale powinno styknąć. Gdybyś miał zgodne nazwy kolumn z id, byłoby jeszcze prościej.


Dzięki

Załóżmy że są zgodne, jak wtedy zrobić to prościej?

Twój kod wyciąga wszystkie kolumny z wiersza o nid=1, w tabeli newsy jak dobrze rozumiem, aby wyciągnąć wybrane kolumny powinienem po select dać ich nazwy zamiast '*', czy on też wyciąga wszystkie kolumny z konkretnego wiersza tabeli autorzy? bo mi zależy tylko na kolumnie 'login' z tabeli autorzy, nie potrzebne mi wszystkie.


--------------------
Artur
Go to the top of the page
+Quote Post
Bags_Bunny
post 5.05.2011, 19:36:59
Post #15





Grupa: Zarejestrowani
Postów: 262
Pomógł: 39
Dołączył: 12.04.2004

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


Cytat(@rtur @ 5.05.2011, 19:00:55 ) *
Załóżmy że są zgodne, jak wtedy zrobić to prościej?

  1. SELECT * FROM newsy LEFT JOIN autorzy USING(autor_id) WHERE nid=1


Cytat(@rtur @ 5.05.2011, 19:00:55 ) *
Twój kod wyciąga wszystkie kolumny z wiersza o nid=1, w tabeli newsy jak dobrze rozumiem, aby wyciągnąć wybrane kolumny powinienem po select dać ich nazwy zamiast '*', czy on też wyciąga wszystkie kolumny z konkretnego wiersza tabeli autorzy? bo mi zależy tylko na kolumnie 'login' z tabeli autorzy, nie potrzebne mi wszystkie.

Tak, możesz np. napisać newsy.*, login albo po prostu wylistować wszystko, co potrzebujesz.

Ten post edytował Bags_Bunny 5.05.2011, 19:37:48


--------------------
rm -rf /*
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: 14.08.2025 - 03:31