Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Łączenie 2 tabel
Forum PHP.pl > Forum > PHP
Mayka
Witam

Mam taki problem, mam sobie 2 tabele w jednej są produkty a w drugiej zdjecia do tych produktów wygląda to mniejwiecej tak:
produkty:
id | nazwa | opis | itd...
1 | jakas | 255znaków opisu | icos tam jescze

zdjecia
|id| produkt_id | nazwa pliku
1 | 1 | zdjecie.jpg
2 | 1 | zdjecie.jpg
3 | 1 | zdjecie.jpg

i teraz chciałbym wyświetlić tylko to zdjęcie z najniższym id, jako zdjęcie główne żeby było na stałe to samo. I mam z tym problem bo nie bardzo znam sie na łączeniu tabel w jednym zapytaniu.. Zrobiłem coś takiego :
  1. SELECT products.name,products.id, product_images.file FROM products LEFT JOIN product_images ON products.id = product_images.product_id ORDER BY products.id

Ale to wyświetla wszystkie 3 fotki.. A ja bym chciał żeby dla każdego z powiedzmy 100 produktów wyświetlała sie jedna fotka. Jak by ktoś mogł mi pomóc i poprawić żeby to zadziałało tak jak powinno to byłbym wdzieczny wink.gif
fr33d0m
LIMIT 1 i sortowanie po ASC - powinno załatwić problem.
Mayka
No ale jak produktów jest 100 czy 50 to jak limit 1 by załatwił sprawe ? albo inaczej jak ograniczyć w takim razie wyswietlanie produktów do niewiem 37 ?
fr33d0m
  1. SELECT p.id, p.nazwa,p.opis, z.id, z.produkt_id, z.nazwa FROM produkty p, zdjecia z WHERE z.produkt_id=p.id GROUP BY z.produkt_id ORDER BY z.id ASC

Coś w ten deseń...
Pisane z palca, a nie jestem dobry w te klocki, więc popróbuj z GROUP i ORDER.
Aby ograniczyć wyświetlanie używasz LIMIT.
mmmmmmm
  1. SELECT p.id, p.nazwa,p.opis, z.id, z.produkt_id, z.nazwa FROM produkty p LEFT JOIN (SELECT produkt_id, min(id) id FROM zdjecia GROUP BY 1) x ON x.produkt_id=p.id JOIN zdjecia z ON z.id=x.id
neosatan
  1. SELECT products.name,products.id, (SELECT file FROM product_images WHERE product_id = products.id ORDER BY id ASC LIMIT 1) AS 'file' FROM products ORDER BY products.id


Nie wiem czy jest sens łączenia tabel za pomocą JOIN, gdy pobieramy tylko jedną komórkę. Tutaj raczej muszę się spece wypowiedzieć. Problem z join polega na tym, że wypluje więcej wyników, gdy produkt ma więcej zdjęć (a podejrzewam, że nie o to chodzi), można to zniwelować bawiąc się GROUP BY, LIMIT i ORDER, ale po co skoro można prostym sposobem zawrzeć jedno podzapytania
Mayka
No własnie nie bardzo wiedziałem jak to połączyć żeby nie robić 2 zapytań oddzielnie i odrazu dostać wynik taki jak potrzebuje, przetrenuje pozniej to co podał neosatan ale mysle ze to rozwiąże mój problem.
alegorn
na kanwie twojego zapytania
  1. -- twoje:
  2. SELECT products.name,products.id, product_images.file FROM products LEFT JOIN product_images ON products.id = product_images.product_id ORDER BY products.id
  3.  
  4. -- moje:
  5. SELECT products.name,products.id, product_images.file FROM products LEFT JOIN product_images ON products.id = product_images.product_id
  6. GROUP BY products.id -- to jest ten dodatek
  7. ORDER BY products.id


wyswietli ci wszystkie rekordy z tabeli products i pierwszy spelniajacy kryterium rekord z tabeli product_images
Mayka
No i o to mi własnie chodziło wink.gif Dzieki za pomoc
mmmmmmm
@alegorn
Nie ucz bzdur!
To zapytanie jest błędne i będzie działać tylko na pseudobazie jaką jest MySQL (i to domyślnie, czyli źle, skonfigurowanej). Na każdej innej się wykrzaczy o grupowanie.
Mayka
Cytat(mmmmmmm @ 3.07.2012, 22:30:31 ) *
@alegorn
Nie ucz bzdur!
To zapytanie jest błędne i będzie działać tylko na pseudobazie jaką jest MySQL (i to domyślnie, czyli źle, skonfigurowanej). Na każdej innej się wykrzaczy o grupowanie.


No to może powiedz jak to powinno być zrobione i dlaczego nie tak ? Co masz na mysli mowiac o "pseudo bazie jaka jest mysql "?
No i najważniejsze, dlaczego daje potrzebny efekt ?
mmmmmmm
  1. SELECT
  2. products.name,
  3. products.id,
  4. product_images.file
  5. FROM
  6. products
  7. LEFT JOIN
  8. product_images
  9. ON products.id = product_images.product_id
  10. GROUP BY products.id
  11. ORDER BY products.id

Prawidłowo to zapytanie powinno wyglądać tak (uwzględniając, to że musi występować GROUP BY)
  1. SELECT
  2. products.name,
  3. products.id,
  4. product_images.file
  5. FROM
  6. products
  7. LEFT JOIN
  8. product_images
  9. ON products.id = product_images.product_id
  10. GROUP BY
  11. products.name,
  12. products.id,
  13. product_images.file
  14. ORDER BY products.id

A co zwróci to? Nie wiem. Podobnie jak MySQL nie wie, co zwróci pierwsza wersja tego zapytania...
Dowód? Proszę: http://dev.mysql.com/doc/refman/5.1/en/gro...en-columns.html
Polecam to zdanie:
"The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate."
Mayka
No i kaszana wychodzi... pierwsze 5 jest ok pozniej jest id9, id9 ,id13,id13 ... No to niema sposobu żeby połączyć 2 tabele ? Musze zrobić to zapomocą 2 zapytań ? No bo przeciez to jest jakas przesada żeby nie można było przewidziec co sie wyświetli przecież..

To co napisał neosatan działa tak jak powinno
  1. SELECT products.name,products.id, (SELECT file FROM product_images WHERE product_id = products.id ORDER BY id ASC LIMIT 1) AS 'file' FROM products ORDER BY products.id
mmmmmmm
A sprawdziłeś zapytanie, które ja ci napisałem? Wczoraj 00:08
Mayka
Sprawdziłem wink.gif

Mam teraz inne pytanie jak zrobić żeby pobierało dane z jednej tabeli i sprawdzało czy id_produktu jest w drugiej tabeli ijeśli jest to żeby nie zwracało takiego wyniku ?
Można to zrobić jednym zapytaniem ? Bo probowałem
  1. SELECT * FROM products WHERE user_id = '4' AND sold = 'tak' NOT IN (SELECT products.id FROM reviews JOIN products WHERE reviews.product_id = products.id)

Ale wyświetla wszystko a ja bym chciał zrobić tak że jeśli jest product_id w tabeli reviews o takiej samej wartości jak od w tabeli products to żeby nie zwracało już takiej wartości. Albo inaczej, zeby zwróciło wszystko co jest w produktach ale nie te co maja juz wpis o takim samym product_id.
Bosh.. ale namotałem, mam nadzieje że wiecie o co mi chodzi wink.gif
mmmmmmm
  1. SELECT * FROM products WHERE user_id = '4' AND sold = 'tak' AND id NOT IN (SELECT product_id FROM reviews )
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.