2013-03-21 2 views
0

Я продолжаю работать над проблемой при вызове из MySQL и получении того, что мне нужно. У меня есть две таблицы, называемые проектами и записями, что я пытаюсь сделать, это получить последнюю запись с отметкой времени. Запрос SQL выглядит следующим образом:Выбор из двух таблиц и последней записи

SELECT 
    projects.ProjectLogo, projects.ProjectLink, projects.ProjectDescription, 
    entries.EntryNum, entries.Votes, entries.Views, entries.Update 
FROM 
    projects 
    LEFT JOIN entries 
     ON projects.ProjectID = entries.ProjectID 
     AND projects.Media = 'image' 
     AND projects.Type = 'fan-art' 
GROUP BY 
    projects.ProjectID 
ORDER BY 
    entries.Update DESC 

Вопрос в том, что я получаю результаты, но не последняя запись, я использовал MAX (entries.Update), но он не работает. Какие-либо предложения? Почему это не работает?

+0

Вы пытаетесь получить последнюю запись штампа времени для каждого ProjectID? –

+0

Да, последняя запись. Столбец обновления должен быть тем, у кого есть метка времени, и устанавливается на время, когда строка была отправлена. – user2197331

ответ

0

Вы можете использовать подзапрос, чтобы получить последние Update за каждые ProjectID на столе entries. Результат подзапроса затем присоединяется к двум заявлениям о соединении, которые должны совпадать по двум столбцам: ProjectID и Update.

SELECT projects.ProjectLogo, 
     projects.ProjectLink, 
     projects.ProjectDescription, 
     entries.EntryNum, 
     entries.Votes, 
     entries.Views, 
     entries.Update 
FROM projects 
     INNER JOIN entries 
      ON projects.ProjectID = entries.ProjectID 
     INNER JOIN 
     (
      SELECT a.ProjectID, MAX(a.Update) max_val 
      FROM entries a 
      GROUP BY a.ProjectID 
     ) b ON b.ProjectID = entries.ProjectID AND 
       b.max_val = entries.Update 
WHERE projects.Media = 'image' AND 
     projects.Type = 'fan-art' 
ORDER BY entries.Update DESC 
+0

Спасибо, J W, он работает красиво, но тогда вопрос был внутренним соединением? – user2197331

+0

hmmm, что вы хотите сделать? вы хотите получить все записи из таблицы 'Project'? или вы спрашиваете, почему я использую 'INNER JOIN'? –

+0

Нет, я просто перепутал с моим кодом, чтобы не догадаться, что у меня проблема. Еще раз спасибо за вашу помощь. Теперь я пытаюсь выяснить свой PHP-код и посмотреть, почему он не работает, но это мой беспорядок, чтобы исправить. Еще раз спасибо – user2197331

0

Вы должны ограничить соединение только записью (строкой) с последней датой ввода. , если pk в записях хронологически увеличивается, вы можете использовать его.

Select p.ProjectLogo, p.ProjectLink, p.ProjectDescription, 
     e.EntryNum, e.Votes, e.Views, e.Update 
From projects p 
    Left Join entries e 
    On e.EntryId = 
     (Select(Max(entryId) from entries 
     where ProjectID = p.ProjectID) 
Where p.Media = 'image' 
    And p.Type = 'fan-art' 
Group By p.ProjectID 
Order By e.Update Desc 

В противном случае, вам нужен двойной вложенный подзапрос

Select p.ProjectLogo, p.ProjectLink, p.ProjectDescription, 
     e.EntryNum, e.Votes, e.Views, e.Update 
From projects p 
    Left Join entries e 
    On e.EntryId = 
     (Select entryId from entries 
     where ProjectID = p.ProjectID 
      And update = 
       (Select max(update) From entries 
       Where ProjectID = p.ProjectID))       
where p.Media = 'image' 
    And p.Type = 'fan-art' 
Group By p.ProjectID 
Order By e.Update Desc 
+0

Это работает и аккуратно структурировано. Спасибо, Чарльз! – user2197331

0

Попробуйте использовать подзапрос, чтобы получить последнюю запись:

select projectId, max(`update`) as lastUpdate 
from entries 
group by projectId 

А теперь использовать этот подзапрос, чтобы получить то, что вам нужно :

select ... 
from 
    projects as p 
    inner join entries as e on p.projectId=e.projectId 
    inner join (
     select projectId, max(`update`) as lastUpdate 
     from entries 
     group by projectId) as me on e.`update`=me.lastUpdate 

Надежда помогает вам

+0

Я тоже тестировал этот, он работает точно так же. Спасибо за вашу помощь. – user2197331

+0

это как-то потерпит неудачу, потому что это будет отображаться только на результат, где 'entries.update' равно' suquery.lastUpdate'. –

+0

Да, я заметил, я догадываюсь, что я повторил один из предыдущих кодов. Я получил результаты с другим кодом из J W, но теперь моя проблема - это не запрос mysql, а отображение информации с помощью php для отображения на веб-сайте. Что я мог бы попытаться выяснить самостоятельно, прежде чем сдаться и задать другой вопрос. – user2197331

Смежные вопросы