2013-03-18 3 views
0

Я пытаюсь выполнить SQL-запрос, который выводит каждую категорию в моей таблице категорий. Также как подсчет каждого потока, связанного с категорией. Теперь это прекрасно работает, но когда я пытаюсь добавить новое поле, где мне нужно показать последнее время datetime, это происходит неправильно.SQL Query outputing wrong

Это мой SQL до сих пор:

SELECT categories.category_name, 
     categories.category_id, 
     COUNT(threads.thread_category_id) AS 'threadCount', 
     threads.thread_datetime 
FROM categories LEFT OUTER JOIN 
     threads ON categories.category_id = threads.thread_category_id 
GROUP BY categories.category_name, categories.category_id, threads.thread_datetime 
ORDER BY threads.thread_datetime DESC 

Это в результате следующее:

enter image description here

Но то, что я на самом деле хочу его вывести это, а также поле кроме того, с thread_datetime последней темы в моей таблице нитей на основе ORDER BY

enter image description here

Я пробовал разные JOINS, а также многие другие ресурсы. Кажется, не удается найти способ, который работает.

+0

Какая СУБД вы используете? Вероятно, MySQL, судя по неправильному использованию 'GROUP BY': http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html –

ответ

1

Попробуйте это (переехав DateTime из вашей группы по к агрегированной части избранных)

SELECT categories.category_name, categories.category_id, 
COUNT(threads.thread_category_id) AS 'threadCount', MAX(threads.thread_datetime) 
FROM categories LEFT OUTER JOIN threads ON categories.category_id =  threads.thread_category_id 
GROUP BY categories.category_name, categories.category_id 
ORDER BY max(threads.thread_datetime) DESC 
+0

Это, казалось, сделало трюк. Никогда не думал об использовании MIN & MAX раньше. Я приму свой ответ, когда смогу. Спасибо! –

+0

@KevinJensenPetersen, делает трюк, за исключением того, что он дает другую схему, указанную в вопросе и неупорядоченных данных. – Jodrell

+0

@KevinJensenPetersen, если это правильный ответ, это то же самое, что и JodyT, который, кажется, на 2 минуты раньше, по моему расчёту. http://stackoverflow.com/a/15475227/659190 – Jodrell

1

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

Попробуйте следующий запрос:

SELECT 
    categories.category_name, 
    categories.category_id, 
    COUNT(threads.thread_category_id) AS 'threadCount', 
    MAX(threads.thread_datetime) 
FROM categories 
LEFT OUTER JOIN threads 
    ON categories.category_id = threads.thread_category_id 
GROUP BY categories.category_name, categories.category_id 
1

что-то подобное,

SELECT 
       categories.category_name, 
       categories.category_id, 
       COUNT(threads.thread_category_id) AS 'threadCount' 
    FROM 
       categories 
     LEFT OUTER JOIN 
       threads 
        ON categories.category_id = threads.thread_category_id 
    GROUP BY 
       categories.category_name, 
       categories.category_id 
    ORDER BY 
       max(threads.thread_datetime) DESC