Pobieranie danych z kilku tabel (INNER JOIN)

0

Witam,
mam przykładowo dwie bazy:
Produkt: id, nazwa
Cena: id, produkt_id, cena

Jest to tablica wiele(Cena)-do-jeden(Produkt). Jeżeli chce pobrać 2 produkty, ale z najniższą ceną to jak to zrobić ?

Jak robię:

SELECT P.*, C.* FROM Produkt AS P INNER JOIN Cena AS C ON P.id = C.produkt_id ORDER BY P.product_id DESC, C.cena ASC LIMIT 2

To pobiera mi 2 razy ten sam produkt z posortowaną ceną od najmniejszej. Próbowałem limit "wcisnąć" gdzieś wcześniej ale nie można.

Pewnie INNER JOIN wszystko psuje, ponieważ łączy tablice.

Bardzo proszę o pomoc.

0

Dwie bazy? Tablica? Nie!
Masz dwie tabele, to raz.
Dwa nie join ci coś psuje, ale po prostu źle napisałeś zapytanie to i zwróciło nie to co chciałeś. Napisałeś tak:

  • łączymy sobie tabele, w efekcie mamy wszystkie możliwe powiązania produktu z ceną
  • sortujemy to po id produktu (Bóg wie po co...)
  • sortujemy po cenie (ale juz posortowane po ID!)
    W efekcie wynikiem zawsze będą dwa rekordy z najwyższym ID...
    Nie wiem po co wepchnąłeś tam sortowanie po ID, ale jeśli juz musisz je tam miec to powinieneś po ID sortować PO posortowaniu po cenie, a nie przed.
0
Zi00mal napisał(a)

Jeżeli chce pobrać 2 produkty, ale z najniższą ceną to jak to zrobić ?

Najpierw znaleźć 2 produkty z najniższą ceną - na przykład posortować po cenie malejąco i wziąć dwa z góry:

 
select produkt_id 
from cena
order by cena desc
limit 2

a potem łączyć joinem, mniej więcej tak

select .... from produkt pr
join (
   select produkt_id 
   from cena
   order by cena desc
   limit 2
) xx 
ON pr.id = xx.produkt_id
0

Witam,
oczywiście że tabele a nie tablice/bazy.

Próbowałem tą metodę kordirko, ale nic nie idzie. Ale patrząc na pytanie to chyba źle zostało zrozumiane co chce pobrać.

Do jednego produktu jest przypisane np.: 10 cen. Takich produktów mam np.: 5.
I ja chcę pobrać 2 produkty z tych pięciu z najniższą ceną (z tych 10-ciu). Nie szukam produktów po cenie tylko wybieram 2 dowolne produkty (nawet metodą RAND) i pobieram dla każdego z nich, jego najniższą cenę.

Jeszcze mam pytanie czy można w MySQL stosować podwójne SELECT ... FROM ? Widziałem że ktoś tak miał, ale u mnie to nie działa.

Pozdrawiam

Edit:
udało mi się połączyć, ale pobrał mi 4 produkty (zmieniłem z 2 na 4), ale po cenie, a nie tak jak pisałem wcześniej.

SELECT P.*, C.* FROM Produkt AS P INNER JOIN (Cena AS C ORDER BY C.Price LIMIT 1) ON P.id = C.produkt_id LIMIT 4

Spróbowałem też "zamienić miejscami", ale to nic nie dało. Zaczynam rozumieć co źle robię, ale nie wiem co zmienić.

0

OMG to umiesz pisać po polsku? o_O Napisałeś w pierwszym poście zupełnie co innego to się nie dziw. Rozwiązania widzę dwa:

  • puszczenie distinct na product.id i wtedy nie będzie już duplikatów
  • zamiast wybierać cenę to wybieraj MIN(cena), zgrupuj po ID, a następnie posortuj po tej cenie
0

A mógłbyś wrzucić jakiś przykład ? DISTINCT nie działa (dołączyłem do powyższego przykładu). A jak daję MIN() to wyświetla tylko jeden rekord.

Edit:
Poczytałem teraz o DISTINCT (nie byłem wcześniej w domu) i jest pewien minus - działa dla wszystkich podanych kolumn, więc:

SELECT DISTINCT P.id, C.Price FROM Produkt AS P INNER JOIN (Cena AS C) ON P.id = C.produkt_id LIMIT 4

spowoduje wypisanie kilka razy tego samego P.id (Cena będzie się zmieniać).

Natomiast

SELECT DISTINCT P.id FROM Produkt AS P INNER JOIN (Cena AS C) ON P.id = C.produkt_id LIMIT 4

Spowoduje wyświetlenie tylko kolejnych P.id (połowa sukcesu).

0

To twoje drugie zapytanie jest bez sensu bo wcale nie sortujesz po cenie.
Poza tym min() zwróci ci oczywiście tylko jeden rekord, dlatego napisałem że masz grupować po ID. Rozumiem że o grupowaniu nie przeczytałeś więc uznałeś że ten fragment olejesz? o_O

0

Zastanów się zanim coś napiszesz. Niby czemu miałem nie czytać ? Nie pisałem nic o tym bo jeszcze nie sprawdziłem wszystkich rozwiązań.

Udało mi się pogrupować i na razie nic dalej nie robiłem. Zaraz siądę to sprawdzę co zrobić by sortował po cenie, chyba że podasz jakieś rozwiązanie zamiast mnie krytykować.

SELECT P.id, C.Cena FROM Produkt AS P INNER JOIN (Cena AS C) ON P.id = C.produkt_id GROUP BY P.id ORDER BY P.id DESC LIMIT 4
0

Dobra mam. Dodałem MIN(), oto wynik:

SELECT P.id, MIN(C.Cena) AS Cena FROM Produkt AS P INNER JOIN (Cena AS C) ON P.id = C.produkt_id GROUP BY P.id ORDER BY P.id DESC LIMIT 4

Jeżeli ktoś ma jakieś uwagi to bardzo proszę o wypowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1