Mam takie tabele (taki pseudokod):
  1. TABLE tabelaA
  2. a_id INT UNSIGNED PRIMARY KEY
  3. a_name VARCHAR(255) (jakiś tekst)
  4. a_blocked TINYINT UNSIGNED (0 = zablokowany, 1 = odblokowany)
  5. a_priority INT UNSIGNED (im mniejsza liczba tym wyżej w pozycji)
  1. TABLE tabelaB
  2. b_id INT UNSIGNED PRIMARY KEY
  3. a_id INT UNSIGNED FOREIGN KEY (połączony z kluczem głównym poprzedniej tabeli)
  4. b_name VARCHAR(255) (jakiś tekst)
  5. b_date INT UNSIGNED (w postaci UNIXOWEGO znacznika czasu)
  6. b_blocked TINYINT UNSIGNED (0 = zablokowany, 1 = odblokowany)
  7. b_priority INT UNSIGNED (im mniejsza liczba tym wyżej w pozycji)


Teraz jak zadać zapytanie aby otrzymać:
1. a_id, a_name, b_id, b_name
2. te wiersze, które po złączeniu oba są odblokowane
3. uporządkowanie wg priorytetów (najpierw wg priorytetu z tabeli tabelaA)
I najważniejsze czyli to z czym sobie nie mogę poradzić:
4. Po złączeniu ON a.a_id = b.a_id każdy oblokowany wiersz z tabeliA ma się łączyć dokładnie z jednym odblokowanym wierszem z tabeliB (o ile taki istnieje - dlatego dałem INNER JOIN) w taki sposób, że będzie to ten wiersz wybrany z tabeliB, którego data (kolumna b_date) jest największa.

Punkty 1+2+3 potrafię zrobić:
  1. SELECT a.a_id, a.a_name, b.b_id, b.b_name
  2. FROM tabelaA AS a
  3. INNER JOIN tabelaB AS b
  4. ON a.a_id = b.a_id
  5. AND a_blocked = 1
  6. AND b_blocked = 1
  7. ORDER BY a_priority ASC, b_priority ASC

Myślałem o jakiś podzapytaniach ale moje myślenie spełzło na niczym : /