2015-01-26 3 views
0

У меня есть система обзора на моем сайте, где пользователи (профили) могут оставлять отзывы для других. Эта часть работает нормально.mySQL заказать и отличные

Но на моей домашней странице я хочу, чтобы получить 10 из последних обзоров, но я не хочу, чтобы дублировать любые пользователей/профилей (например, если пользователь имеет 2 отзыва я хочу только самые последние)

Добавление DISTINCT не делает этого, поскольку все обзоры/строки уникальны. (я действительно добавляю DISTINCT, хотя, поскольку некоторые пользователи представляют повторяющиеся обзоры ...)

Я пробовал GROUP BY ProfileID, но это не обязательно возвращает самый последний обзор, и я не могу решить, как это сделать. (эффект GROUP BY имеет желаемый эффект, но я думаю, что может смешивать данные и не получать результаты в порядке дат).

Ниже (упрощенный) SQL - это то, что у меня есть, но это возвращает более 1 отзыв на одного пользователя (если они имеют более чем 1)

SELECT DISTINCT LEFT(r.ReviewText, 100) as Review, r.ReviewRating, r.ReviewDate, 
p.ProfileName, p.Location, p.ProfileID, 
((date_format(now(),'%Y') - date_format(p.DateOfBirth,'%Y')) - (date_format(now(),'00-%m-%d') < date_format(p.DateOfBirth,'00-%m-%d'))) AS Age 
FROM tReview r 
INNER JOIN tProfiles p ON p.ProfileID = r.tProfiles_ProfileID              
WHERE r.ReviewWithdrawn = 0 
    AND r.ReviewEnabled = 1 
    AND p.Enabled = 1 
ORDER BY r.ReviewDate DESC      
LIMIT 10 

Любые идеи (без фильтрации в PHP) о том, как я могу получить 10 результатов, в хронологическом порядке, но только в том числе каждого пользователя один раз (так что если у пользователя есть 2 отзыва, только последние будут возвращены)?

+0

Вы уже видели это сообщение? http://stackoverflow.com/questions/6841605/get-top-1-row-of-each-group –

+0

@RandykaYudhistira спасибо, звучит так же, как и мне, хотя они объяснили это лучше, чем я. Еще раз спасибо! – Ford

+0

@RandykaYudhistira спасибо, но я не могу получить какой-либо метод для работы для меня :-( – Ford

ответ

1

Вы можете сначала выбрать максимальную дату для каждого пользователя с reviews, а затем присоединиться к себе и profiles, чтобы захватить все остальные столбцы.

SELECT LEFT(r.ReviewText, 100) as Review, 
     r.ReviewRating, r.ReviewDate, p.ProfileName, p.Location, p.ProfileID, 
     ((date_format(now(),'%Y') - date_format(p.DateOfBirth,'%Y')) - 
     (date_format(now(),'00-%m-%d') < date_format(p.DateOfBirth,'00-%m-%d'))) AS Age 
    FROM 
(
    SELECT p.ProfileID, MAX(r.ReviewDate) ReviewDate 
    FROM tReview r JOIN tProfiles p 
     ON r.tProfiles_ProfileID = p.ProfileID 
    WHERE r.ReviewWithdrawn = 0 
    AND r.ReviewEnabled = 1 
    AND p.Enabled = 1 
    GROUP BY p.ProfileID 
    ORDER BY ReviewDate DESC 
    LIMIT 10 
) q JOIN tReview r 
     ON q.ProfileID = r.tProfiles_ProfileID 
    AND q.ReviewDate = r.ReviewDate 
    JOIN tProfiles p 
     ON r.tProfiles_ProfileID = p.ProfileID 
Смежные вопросы