Skocz do zawartości

[mysql] zapytanie - łączenie dwóch tabel - pilny problem


psw779
 Udostępnij

Rekomendowane odpowiedzi

Mam taką strukturę w bazie:

Tabela galleries

id [int (11)]

date [date]

time [time]

name [varchar (150)]

Tabela pictures

id [int (11)]

idg [int (11)]

date [date]

time [time]

title [varchar (150)]

Chciałbym jednym zapytanie wyciągnąć 10 galerii do których ostatnio zostały dodane zdjęcia. Dodam jeszcze, że oprócz ID potrzebuje wyciągnąć jeszcze tytuł ostatnio dodanej fotki więc samo MAX(id) z tabeli pictures nie wystarczy.

Męczę się już z tym sporo i zatrzymałem się mniej więcej na tym że najpierw działa klauzula GROUP BY a potem ORDER BY co uniemożliwia mi posortowanie tego tak jak bym chciał.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem czy to trochę nie naokoło:

SELECT galleries.id, galleries.date, galleries.time, galleries.name, pictures.id, pictures.title FROM galleries
LEFT JOIN pictures ON pictures.idg = galleries.id AND pictures.id=(SELECT MAX(pictures.id) FROM picturies WHERE picturies.idg=galleries.id)
ORDER BY picturies.id DESC

Odnośnik do komentarza
Udostępnij na innych stronach

Wydaje mi się, że jedynym optymalnym rozwiązaniem będzie dodanie pola do galleries zawierającego id ostatniego pictures. Przy dodawaniu rekordów do pictures będziesz musiał uaktualnić tabelę galleries, ale unikniesz mojego powolnego zapytania :P

Ewentualnie jakiś cache.

Lepszego rozwiązania nie znam :)

Odnośnik do komentarza
Udostępnij na innych stronach

jak by mysql był dobra baza danych to powiedział bym użyj triggerów :)

ale że mysql nie jest dobra baza danych trzeba kombinowac

Troch tutaj skrótów myslowych ale powinno działać.

ZAPYTANIE tabela_X =

select

ID,

( select max(data+ czas) from pictures where idg = g.id)

FROM galleries g;

i potem wykonujemy

select X.ID, X.(data+czas), pictures.* from

tabela_X X, pictures p where p.idg = X.id

order by 2 limit 10

tylko trzeba to wszystko skleic do jednego zapytania :

select X.ID, X.(data+czas), pictures.* from

(select

ID,

( select max(data+ czas) from pictures where idg = g.id)

FROM galleries g) X, pictures p where p.idg = X.id

order by 2 limit 10

Duzym bledem jest rozbijanie daty i czasu na dwie kolumny ;)

Odnośnik do komentarza
Udostępnij na innych stronach

SELECT g.*,p.* FROM pictures p
LEFT OUTER JOIN galleries g ON p.idg=g.id
WHERE (p.date+p.time) in (SELECT max(date+time) FROM pictures pp WHERE pp.idg=p.idg)
GROUP BY p.idg
ORDER BY (p.date+p.time) DESC LIMIT 10

Edytowane przez GrandPL

Wykończeniówka Wrocław - jeśli szukasz firmy do remontu lub wykończenia mieszkania

FM Group sklep internetowy - sklep internetowy z produktami FM Group

Hokej Wrocław - amatorska drużyna hokejowa WTH Wrocław

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności