[php]zapytanie do bazy do dwóch tabel


(batmomobil) #1

Jak zapisać zapytanie do bazy do dwóch tabel,pierwsza tabela

$query = "SELECT id_zdjecie_user, nazwa_zdjecie_user, opis_zdjecie_user, link_zdjecie_user FROM galeria_user WHERE id_zdjecie_user>=$limit ";	

$result = mysql_query($query) or die(mysql_error($mysqli));

if ($result)

i druga tabela:komenarze_user i pola id_komenarze_user,nick_kometarz_user,czas_komenarz_user.Jeszcze jedno pytanie jak zapisać aby zdjęcia były przypisane danemu użytkownikowi nick='$nick'.


(mozilla007) #2
SELECT * FROM galeria_user, komenarze_user WHERE id_zdjecie_user.galeria_user = id_komenarze_user.komenarze_user

Coś takiego. Założyłem że id_zdjecie_user to id z tablicy user (czyli loginy itd) to id usera, a w drugim zapytaniu porównanie jest do własnie tego id. łączenie tabel przebiega w podobny sposób czyli:

SELECT * FROM tabela1, tabela2 WHERE id_user.tabela1 = id_cos.tabela2

(batmomobil) #3

próbowałem zrobić zapytanie tak jak mi napisałeś,ale w ogóle mi nie wyświetla zdjęć.Zacznę jeszcze raz:mam dwie tabele,1-uzytkownicy,2-galeria_user.W 1 są przechowywane dane użytkowników,a w 2 same zdjęcia.Próbowałem dać takie zapytanie:

$query = "SELECT id_zdjecie_user, nazwa_zdjecie_user, opis_zdjecie_user, link_zdjecie_user FROM uzytkownicy,galeria_user WHERE `nick`='$nick' AND id_zdjecie_user >=$limit ";]

i wyświetla zdjęcia ale mają być danego użytkownika.Użytkownik:

SELECT * FROM uzytkownicy WHERE `nick`='$nick' LIMIT 1]

(mozilla007) #4

a jest jakaś relacja między tymi bazami?? Chodzi mi o klucz główny. Ja zawsze taki sobie daje bo później jest łatwiej robić takie zapytania.

Chodziło mi o coś takiego że pobiera się identyfikator użytkownika i później sprawdza się zapytania w bazie o dane usera.


(batmomobil) #5

Nie wiem o co chodzi,ale pobieram użytkownika po przez 'nick' z tabeli uzytkownicy,a tabela druga jest do przechowywania zdjęć.Jak zapisać to zapytanie aby przypisać nickowi zdjęcia.


(MaXDemage) #6

Woo, hola moment.

Spokojnie.

Zacznijmy od tego:

  • napisz co chcesz zrobić, dokładnie - punkt po punkcie. Bo nie do końca wynika to z Twoich postów

  • o ile to możliwe przedstaw obie tabele w czytelnej formie np coś w tym stylu:

    TABELA user

    id_zdjecie_user INT PRIMARY KEY

    nazwa_zdjecie_user TEXT

    opis_zdjecie_user TEXT

    link_zdjecie_user TEXT

Jeśli masz problem, bo nie wiesz jak to jest wygląda, o ile to możliwe wrzuć printy z phpMyAdmina, lub po prostu opisz je najlepiej jak możesz ale tak strukturalnie.

Wtedy zobaczymy i coś sensownego napiszemy, bo póki co mogę tylko zgadywać o co chodzi i jeśli dobrze zgaduje to masz bajzel w bazie i nie uda Ci się tego zrobić o czym myślę.


(batmomobil) #7

Ok!!!są dwie tabele.W pierwszej są użytkownicy i pola:id,nick,nazwa,haslo,adres itd

CREATE TABLE 'uzytkownicy' (

'id' INT( 10 ) NOT NULL AUTO_INCREMENT ,

'nick' VARCHAR( 255 ) DEFAULT NULL ,

'opis' text,

'link_avatar' VARCHAR( 255 ) NOT NULL ,'haslo' VARCHAR( 255 ) DEFAULT NULL ,

PRIMARY KEY ( 'id_zdjecie' )

);

.W drugiej tabeli są pola:

CREATE TABLE 'galeria_user' (

'id_zdjecie_user' INT( 10 ) NOT NULL AUTO_INCREMENT ,

'nazwa_zdjecie_user' VARCHAR( 255 ) DEFAULT NULL ,

'opis_zdjecie_user' text,

'link_zdjecie_user' VARCHAR( 255 ) NOT NULL ,

PRIMARY KEY ( 'id_zdjecie' )

);

gdzie są przechowywane zdjęcia.Chodzi o zapytanie do bazy tak aby każdemu użytkownikowi przypisać jego zdjęcia(galerie).dałem takie zapytanie i przypisało zdjęcia użytkownikowi,ale wyświetla tylko jedno zdjęcie użytkownika,jak to zrobić by wyświetlało wszystkie

$query = "SELECT id_zdjecie_user, nazwa_zdjecie_user, opis_zdjecie_user, link_zdjecie_user FROM galeria_user WHERE ".$user['id']."= id_zdjecie_user >=$limit ";]

a tutaj podaję cały kod:

<?php include("config.php");

$nick = $_SESSION['nick'];

$haslo = $_SESSION['haslo'];

  if ((empty($nick)) AND (empty($haslo))) {

echo '
Nie byłeś zalogowany albo zostałeś wylogowany
Strona Główna
';

exit;

} if(isset($_GET['nick']))

$nick = $_GET['nick'];		

$user = mysql_fetch_array(mysql_query("SELECT * FROM uzytkownicy WHERE `nick`='$nick' LIMIT 1"));

    if (empty($user[id]) OR !isset($user[id])) {

echo '
Nieprawidłowe logowanie.
';

exit;

}

echo'Witaj'.$user[nick].'';echo'
Wylogujmnie'; echo'Dodajtapete'; echo'Twójprofil'; echo'Galeriazdjęć'; echo'Edytujprofil/popraw'; echo'
'; require 'db.php';						

$limit=(isset($_GET['go']))?$_GET['go']:1; $back=''; if($limit>=6) $back = '<	Poprzednie';

$next='Nastepne'; $query="SELECTid_zdjecie_user,nazwa_zdjecie_user,opis_zdjecie_user,link_zdjecie_user,czas_zdjecie_userFROMuzytkownicy,galeria_userWHERE ".$user['id']."=id_zdjecie_user>=$limit ";

$result = mysql_query($query) or die(mysql_error($mysqli));

if ($result) { echo"
  • "; while ($row = mysql_fetch_object($result)) { $nick = $row->nick; $nazwa = $row->nazwa_zdjecie_user; $opis = $row->opis_zdjecie_user; $link = $row->link_zdjecie_user; $czas=$row->czas_zdjecie_user; echo "

$nazwa

$opis $czas \n"; } echo "
"; } echo$back.'|'.$next; ?>[/code] i mam problem jeszcze w pliku uplaudu zdjęć,chodzi o to by kod tworzył folder każdemu użytkownikowi
[code]$folder="testdir\subdir\test"; mkdir($folder,0777,TRUE);

jak to zapisać.


(MaXDemage) #8

No i wszystko jasne.

Niestety masz trochę źle rozplanowane tabele. To co napiszę, będzie czasem wręcz niesłychanie proste i oczywiste, ale chciałbym aby inni ewentualnie też mogli z tego skorzystać w przyszłości gdy będą szukać opcji łączenia tabel, lub będą mieli podobny problem.

Zacznijmy od tego, że najpierw tworzysz (już ją masz, ale idę po kolei) tabelę z użytkownikami.

UŻYTKOWNICY

  • id_użytkownika - numerek dzięki któremu użytkownik będzie rozpoznawalny. Ten numer wykorzystamy również wszędzie tam gdzie będą dane tego użytkownika. Jest to tzw klucz podstawowy, który ułatwi nam wyszukiwanie i wydobywanie danych z tabeli - primary key.

  • pozostałe pola - czyli nazwa użytkownika, haslo, opis, link do avatara.

Delikatna sugestia - nie potrzebujesz mieć pola hasłowego 255 znakowego. Powinieneś skorzystać z jakiejś funkcji haszującej to po pierwsze, np md5, wtedy można spokojnie dać char(32) i tabela mocno przyśpieszy. Ewentualnie jeśli potrzebujesz mieć hasła luzem (a bywa tak) - sądzę że spokojnie 20 znaków by wystarczyło, jak chcesz być mocno przesądny to możesz dać 50. Plus opis_uztkownika chyba dałbym tinytext, ale trudno mi powiedzieć, co tam planujesz aby było. Reszta pól to kwestia gustu i tego jak mocno chcemy optymalizować bazę. Można zmniejszyć nazwę użytkownika i link do avataru i tak dalej.

Tabela GALERIA_USER - najistotniejsze jest tutaj. Z tego co widzę to wrzucasz kolejne zdjęcia uploadowane przez usera jako kolejne rekordy (wiersze) do tabeli. Dobrze.

Czysto teoretycznie tabela Galerii powinna jednak wyglądać tak.

GALERIA_USER

  • id_zdjecia - numer identyfikacyjny zdjęcia, który powinien być kluczem głównym i unikalnym (wystarczy więc PRIMARY KEY z auto incrementem)

  • id_usera - numer identyfikacyjny użytkownika, który wstawił zdjęcie aby wiedzieć kto wstawił zdjęcie ;D jest to tak zwany klucz zewnętrzny, dla ułatwienia wyszukiwania dobrze było by tu również ustawić klucz.

  • nazwa_zdjecia

- opis_zdjęcia... itd.

Teraz, jeśli chcemy uzyskać spis zdjęć użytkownika robimy zapytanie (zapytanie jest nieoptymalne, ale chodzi o idee):

SELECT * FROM galeria_user WHERE id_user = ".$id_usera."

I tyle. W wyniku otrzymamy listę w której są tylko zdjęcia tego jednego użytkownika którego id podaliśmy w zmiennej $id_usera. Teraz jeśli byśmy chcieli otrzymać listę wszystkich zdjęć ale zamiast pola id_usera które nic nam nie mówi, aby była nazwa usera. Musimy zrobić JOINA

SELECT * FROM galeria_user LEFT JOIN uzytkownicy ON id_usera=uzytkownicy

Niestety to zapytanie jest mocno nieoptymalne gdyż korzystamy z gwiazdki. Poprawimy je trochę.

SELECT id_zdjęcia, nazwa_zdjecia, opis_zdjecia, link_zdjecia, nazwa_uzytkownika FROM galeria_user LEFT JOIN uzytkownicy ON galeria_user.id_usera=uzytkownicy.id_uzytkownika

Wyspecyfikowaliśmy tylko te pola które są potrzebne co znacznie przyśpieszy zapytanie. Możemy jeszcze dodać na końcu LIMIT 'początek', 'liczba' aby ograniczyć i jeszcze bardziej przyśpieszyć, ale to już zależy od architektury strony.

Pozwolę sobie na kilka uwag odnośnie kodu PHP. W sesji przechowujesz 'nick' użtkownika i używając go przeszukujesz tablę użytkowników. Gdy masz siedmiu lub 20 userów. Jest nawet ok. Ale przy dużej ilości, nie jest to optymalne rozwiązanie (w sumie nigdy nie jest optymalne, ale przy małej liczbie można wybaczyć).

Ogólnie masz bardzo chaotyczny kod, albo tak Ci się wkleił - could be.

Masz może pod ręką jakąś książkę MySQLową? Sam za nimi nie przepadam, ale poczytaj w wolnej chwili - zawsze znajdzie się tam parę ciekawostek, które usprawnią Twoje bazy. :]

Życzę powodzenia a jakby coś jeszcze było, śmiało pytaj ;p


(batmomobil) #9

Witam sorry,że powracam do tematu ale nie mogę sobie poradzić z tym zapytaniem, ponieważ chcę wyświetlić teledyski danego użytkownika a nadal wyświetla mi wszystkie wrzucone.Robię LEFT JOIN,czyli zapytanie takie:

$query = "SELECT * FROM muzyka_mp3 LEFT JOIN uzytkownicy ON id_muzyka='.$nick.' ";

$result = mysql_query($query) or die(mysql_error($mysqli));

.Mam takie tabelę użytkownicy:

CREATE TABLE 'uzytkownicy' (

'id' INT( 10 ) NOT NULL AUTO_INCREMENT ,

'nick' VARCHAR( 255 ) DEFAULT NULL ,

'opis' text,

'link_avatar' VARCHAR( 255 ) NOT NULL ,'haslo' VARCHAR( 255 ) DEFAULT NULL ,

PRIMARY KEY ( 'id_zdjecie' )

);

i tabela z teledyskami:

CREATE TABLE 'muzyka_mp3' (

'id_muzyka' INT( 10 ) NOT NULL AUTO_INCREMENT ,

'nazwa_muzyka_mp3' VARCHAR( 255 ) DEFAULT NULL ,

'opis_muzyka_mp3' text,

'link_muzyka_mp3' VARCHAR( 255 ) NOT NULL ,

'muz_id' text,

PRIMARY KEY ( 'id_muzyka' ));

gdzie w polu muz_id zapisuje kto dodał dany teledysk.Niby proste a trudne,proszę o pomoc w napisaniu zapytania :smiley:


(Grzelix) #10

źle, źle, źle - tak nie tworzy się baz danych.

moim zdaniem najlepszym rozwiązaniem (przynajmniej poprawnym ze względu na tworzenie relacyjnych baz danych) będzie utworzenie dodatkowej tabeli

CREATE TABLE 'muzyka_uzytkowika' (

'id' INT( 10 ) NOT NULL AUTO_INCREMENT ,

'id_uzytkownik',

'id_muzyka',

PRIMARY KEY ( 'id' )

);

Powyższy kod jest jedynie szkicem

i w tej tabeli będziesz miał informacje o tym kto posiada jaką muzykę, tę tabelę będziesz updatował gdy użytkownik doda jakiś utwór (usunie) i z tej tabeli w prosty spoób pobierzesz dane kto i jaki utwór posiada.

id)uzytkownika i id_muzyka to klucze obce w tej tabeli


(batmomobil) #11

Mam przecież pole muz_id gdzie zapisuje kto dodał muzykę,czyli kto ma dany utwór,tylko po co mam wprowadzać jeszcze id tego użytkownika do tej tabeli?chodzi o wyświetlenie utworów(listy)danego użytkownika.Czy to ma być jeszcze dodatkowa tabela oprócz mojej tabeli?


(Grzelix) #12

tak to ma być dodatkowa tabela.

owszem masz pole muz_id ale:

  1. pole jest typu text

  2. naprawdę nie chcę tutaj opisywać kursu tworzenie relacyjnych baz danych albo uznasz to co napisałem za przydatne i wykorzystasz albo zapoznaj się z technikami tworzenie relacyjnych baz danych i potem wróć do tego co napisałem i porównaj z twoim pomysłem.

Tutaj naruszasz nawet Pierwsza postać normalna (1NF) http://pl.wikipedia.org/wiki/Posta%C4%87_normalna_(bazy_danych)


(batmomobil) #13

Nie bardzo to rozumiem,bo stworzyłem dodatkową tabelę tak jak pisałeś i zapisuje rekordy

CREATE TABLE 'muzyka_uzytkownika' (

    'id' INT( 10 ) NOT NULL AUTO_INCREMENT ,

    'id_uzytkownik',

    'id_muzyka',

    PRIMARY KEY ( 'id' )

    );

w polu id_uzytkownika zapisuje id uzytkownika z tabeli uzytkowników,ale co ma zapisywać w polu id_muzyka czy to ma być nick???.Ponieważ chodzi mi o wyświetlenie utworów tylko danego użytkownika.,czyli wchodząc na dany profil ma wyświetlać utwory tego użytkownika,a nie wszystkie.


(Grzelix) #14

http://www.sitepoint.com/mysql-foreign- ... velopment/


(batmomobil) #15

Udało mi się,bardzo dziękuję, jesteś wielki :smiley: