Изберете последния ред от множество таблици

Имам тази заявка с множество таблици и получих следния резултат. След това искам да групирам по t.id. Знам, че мога просто да използвам групиране по t.id, но как мога да избера последния ред от t.id, който е url tw5.jpg и created_time 10000004

SELECT p.url,t.name,t.num_photo,t.id
FROM photos AS p
LEFT JOIN tag_maps AS tm ON p.id = tm.photo_id
LEFT JOIN tags AS t ON t.id = tm.tag_id

url                       created_time    name      num_photo  id
assets/img/tags/tw1.jpg   1000001         my house  1           1
assets/img/tags/tw2.jpg   1000002         dog       1           2
assets/img/tags/tw3.jpg   1000003         taiwan    2           3
assets/img/tags/tw5.jpg   1000004         taiwan    2           3

Това е, което получавам, когато използвам group by t.id

url                       created_time    name      num_photo  id
assets/img/tags/tw1.jpg   1000001         my house  1           1
assets/img/tags/tw2.jpg   1000002         dog       1           2
assets/img/tags/tw3.jpg   1000003         taiwan    2           3

И това е, което искам

url                       created_time    name      num_photo  id
assets/img/tags/tw1.jpg   1000001         my house  1           1
assets/img/tags/tw2.jpg   1000002         dog       1           2
assets/img/tags/tw5.jpg   1000004         taiwan    2           3

РЕДАКТИРАНА

Маса със снимки

id    url                      created_time
1     assets/img/tags/tw1.jpg  1000001
2     assets/img/tags/tw2.jpg  1000002
3     assets/img/tags/tw3.jpg  1000003
4     assets/img/tags/tw5.jpg  1000004

Таблица с етикети

id name     num_photo
1  my house 1
2  dog      1
3  taiwan   2

Tag_maps

id   tag_id   photo_id
1    1        1
2    2        2
3    3        3
4    3        4

person vzhen    schedule 14.01.2013    source източник


Отговори (1)


Редактиране #2: Без да виждам примерни данни от всяка таблица или структурите на таблицата, предполагам, че следното ще работи:

SELECT p.url,
  created_time,
  t.name,
  t.num_photo,
  t.id
FROM photos p
LEFT JOIN tag_maps AS tm 
    ON p.id = tm.photo_id
LEFT JOIN tags AS t 
    ON t.id = tm.tag_id
INNER JOIN
(
  select max(created_time) MaxDate, t.id
  FROM photos p
  LEFT JOIN tag_maps AS tm 
      ON p.id = tm.photo_id
  LEFT JOIN tags AS t 
      ON t.id = tm.tag_id
  group by t.id
) d
  on p.created_time = d.MaxDate
  and t.id = d.id;

Вижте SQL Fiddle с демонстрация

Или друг начин да напишете това е с подзаявка, която връща max(photo_id) от tag_Id от таблицата tag_maps и да използвате този резултат в съединението:

SELECT p.url,
  created_time,
  t.name,
  t.num_photo,
  t.id
FROM photos p
INNER JOIN
(
  select max(photo_id) photo_id, tag_id
  from tag_maps
  group by tag_id
) AS tm 
    ON p.id = tm.photo_id
LEFT JOIN tags AS t 
    ON t.id = tm.tag_id

Вижте SQL Fiddle с демонстрация

Резултатът е:

|                     URL | CREATED_TIME |     NAME | NUM_PHOTO | ID |
----------------------------------------------------------------------
| assets/img/tags/tw1.jpg |      1000001 | my house |         1 |  1 |
| assets/img/tags/tw2.jpg |      1000002 |      dog |         1 |  2 |
| assets/img/tags/tw5.jpg |      1000004 |   taiwan |         2 |  3 |

Редактирайте #1, тъй като вашият url е различен и искате max(id), тогава трябва да можете да използвате:

SELECT p.url,
  t.name,
  t.num_photo,
  Max(t.id) id
FROM photos p
LEFT JOIN tag_maps AS tm 
    ON p.id = tm.photo_id
LEFT JOIN tags AS t 
    ON t.id = tm.tag_id
group by t.name, t.num_photo  

OP: Можете да използвате подзаявка:

SELECT p.url,
    t.name,
    t.num_photo 
FROM
(
    select MAX(created_time) created_time, url, id
    from photos
    group by url, id
)  AS p
LEFT JOIN tag_maps AS tm 
    ON p.id = tm.photo_id
LEFT JOIN tags AS t 
    ON t.id = tm.tag_id

Ако стойността id в таблицата photos е уникална за всеки ред, тогава може да се наложи да използвате следното:

SELECT p1.url,
    t.name,
    t.num_photo 
FROM photos p1
inner join
(
    select MAX(created_time) created_time, url
    from photos
    group by url
)  AS p2
    on p1.url = p2.url
    and p1.created_time = p2.created_time
LEFT JOIN tag_maps AS tm 
    ON p1.id = tm.photo_id
LEFT JOIN tags AS t 
    ON t.id = tm.tag_id

person Taryn    schedule 14.01.2013
comment
Добре, идентификаторът в снимките е уникален, така че използвам втория и работи, но защо трябва да групираме по url в подзаявката. И има ли някакъв начин без използване на подзаявка или други прости методи? - person vzhen; 14.01.2013
comment
@vzhen, ако не използвате GROUP BY url, тогава ще върнете само един запис с max(created_time), който искате да разграничите от всяко url. - person Taryn; 14.01.2013
comment
здравей, просто искам да ти кажа, току-що получих грешка и всъщност не работеше. редактирах въпроса си, искаш ли да погледнеш? Благодаря в адв - person vzhen; 15.01.2013
comment
Не работи, изглежда max(t.id) не избира най-новото created_time. Отново редактирах въпроса си, за да бъда по-ясен. - person vzhen; 15.01.2013
comment
Трудно е да се каже от заявката, можете ли да публикувате структурите на таблицата и примерни данни от всяка таблица? - person Taryn; 15.01.2013
comment
@vzhen, предполагах структурата на таблицата, така че вижте моята редакция с версия, която мисля, че ще работи - person Taryn; 15.01.2013
comment
Хаха, ОГРОМНО благодаря за теб. опитвах се с часове, но не успях и благодаря за страната на sqlfiddle. Ще го използвам за sql въпрос следващия път. - person vzhen; 15.01.2013