Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][mysql] Łączenie 2 tabel
Mayka
post 2.07.2012, 19:31:07
Post #1





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


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

Ten post edytował Mayka 2.07.2012, 19:32:19
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
fr33d0m
post 2.07.2012, 20:01:30
Post #2





Grupa: Zarejestrowani
Postów: 132
Pomógł: 4
Dołączył: 22.10.2010

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


LIMIT 1 i sortowanie po ASC - powinno załatwić problem.


--------------------
UWAGA! Stwierdzono naruszenie paragrafu §33 ustawy ACTA. Podpis użytkownika został usunięty.
Go to the top of the page
+Quote Post
Mayka
post 2.07.2012, 20:31:24
Post #3





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


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 ?

Ten post edytował Mayka 2.07.2012, 20:32:01
Go to the top of the page
+Quote Post
fr33d0m
post 2.07.2012, 22:06:09
Post #4





Grupa: Zarejestrowani
Postów: 132
Pomógł: 4
Dołączył: 22.10.2010

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


  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.


--------------------
UWAGA! Stwierdzono naruszenie paragrafu §33 ustawy ACTA. Podpis użytkownika został usunięty.
Go to the top of the page
+Quote Post
mmmmmmm
post 2.07.2012, 23:08:43
Post #5





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  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
Go to the top of the page
+Quote Post
neosatan
post 3.07.2012, 13:24:51
Post #6





Grupa: Zarejestrowani
Postów: 79
Pomógł: 2
Dołączył: 29.04.2009
Skąd: wrocław

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


  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

Ten post edytował neosatan 3.07.2012, 13:29:51


--------------------
C/C++ (ucze się...), PHP (ucze się...), SMARTY(ucze się...), PYTHON(ucze się...), C#(uczę się...), PERL(uczę się...), JavaScript(uczę się...), JAVA(będą mi kazali się uczyć...)... Ja się głównie uczę...
Go to the top of the page
+Quote Post
Mayka
post 3.07.2012, 13:59:01
Post #7





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


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.
Go to the top of the page
+Quote Post
alegorn
post 3.07.2012, 15:15:52
Post #8





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

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


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
Go to the top of the page
+Quote Post
Mayka
post 3.07.2012, 19:58:16
Post #9





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


No i o to mi własnie chodziło wink.gif Dzieki za pomoc
Go to the top of the page
+Quote Post
mmmmmmm
post 3.07.2012, 21:30:31
Post #10





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


@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.
Go to the top of the page
+Quote Post
Mayka
post 3.07.2012, 23:10:15
Post #11





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


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 ?

Ten post edytował Mayka 3.07.2012, 23:10:57
Go to the top of the page
+Quote Post
mmmmmmm
post 4.07.2012, 07:55:26
Post #12





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  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."
Go to the top of the page
+Quote Post
Mayka
post 4.07.2012, 18:55:03
Post #13





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


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


Ten post edytował Mayka 4.07.2012, 18:58:33
Go to the top of the page
+Quote Post
mmmmmmm
post 4.07.2012, 19:16:25
Post #14





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


A sprawdziłeś zapytanie, które ja ci napisałem? Wczoraj 00:08
Go to the top of the page
+Quote Post
Mayka
post 5.07.2012, 16:51:37
Post #15





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


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
Go to the top of the page
+Quote Post
mmmmmmm
post 6.07.2012, 07:47:16
Post #16





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  1. SELECT * FROM products WHERE user_id = '4' AND sold = 'tak' AND id NOT IN (SELECT product_id FROM reviews )
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: 29.06.2025 - 16:55