2013-09-30 2 views
6

Я пытаюсь получить дату из двух таблиц с помощью запроса MYSQL. Я хочу присоединиться к ним вместе: categories.cat_id=topics.topic_cat. Несколько записей могут иметь одинаковое значение topic_cat, поэтому я хочу только SELECT выбрать последнее, которое равно MAX(topic_date).MYSQL JOIN две таблицы ограничивают результаты второй таблицы по дате

В следующем запросе отображается правильная информация из тем, в которой есть только один результат для topic_cat и результат, имеющий самую последнюю дату.

SELECT topic_subject, topic_cat, topic_date 
FROM topics 
GROUP BY topic_cat DESC 

Несколько строк могут иметь одинаковое значение для topic_cat, но я только хочу, чтобы получить и присоединиться только самые последние, MAX (topic_date), а затем присоединиться к запросу, который показывает следующую информацию из таблицы категорий.

SELECT categories.cat_id, categories.cat_name, categories.cat_description, topics.topic_subject, topics.topic_cat, topics.topic_date, topics.topic_by 
FROM categories 
LEFT JOIN topics 
ON categories.cat_id=topics.topic_cat 
GROUP BY cat_id; 

Этот запрос отображает правильную информацию, кроме одного. Он показывает topic_cat с самой старой записью, или MIN(topic_date). Я попробовал следующее, чтобы получить topic_cat по самой новой записи или MAX(topic_date), но безуспешно.

SELECT categories.cat_id, categories.cat_name, categories.cat_description 
FROM categories 
LEFT JOIN (SELECT topic_subject, topic_cat, topic_date, topic_by 
FROM topics 
GROUP BY topic_cat DESC) AS topics 
ON categories.cat_id=topics.topic_cat 

Любая помощь или предложения были бы весьма признательны.

Итак, вот пример данных и соответствующий желаемый результат.

Таблица 1 = категории

_______________________________________________________ 
| cat_id | cat_name  | cat_description    | 
------------------------------------------------------- 
| 1  | james  | Some information about james| 
------------------------------------------------------- 
| 2  | myo   | Some information about myo | 
------------------------------------------------------- 
| 3  | brandon  | Some information about brandon | 
------------------------------------------------------- 

Таблица 2 = темы

__________________________________________________ 
| topic_subject | topic_cat | topic_date | topic_by | 
---------------------------------------------------------- 
| marcos  | 2   | 2013-9-28 | User 1  | 
--------------------------------------------------------- 
| ferdinand  | 2   | 2013-9-29 | User 2  | 
--------------------------------------------------------- 
| maria luisa | 2   | 2013-9-30 | User 1  | 
--------------------------------------------------------- 
| Isabella  | 1   | 2013-8-24 | User 3  | 
-------------------------------------------------------- 
| Carlos  | 3   | 2012-6-21 | User 2  | 
-------------------------------------------------------- 
| Enrique  | 3   | 2011-4-2 | User 3  | 
--------------------------------------------------------- 

Я хотел бы запрос, чтобы возвращать следующие данные, основанные на приведенных выше таблицах:

_________________________________________________________________________________________________ 
| cat_id | cat_name  | cat_description    | topic_subject | topic_cat | topic_date | topic_by  | 
---------------------------------------------------------------------------------------------------------------- 
| 1  | james  | Some information about james | Isabella  | 1   | 2013-8-24 | User 3   | 
---------------------------------------------------------------------------------------------------------------- 
| 2  | myo   | Some information about myo  | maria luisa | 2   | 2013-9-30 | User 1   | 
---------------------------------------------------------------------------------------------------------------- 
| 3  | brandon  | Some information about brandon | Carlos   | 3   | 2012-6-21 | User 2   | 
---------------------------------------------------------------------------------------------------------------- 

I надеюсь, что это прояснит ситуацию.

+1

Просьба представить выборочные данные и связанные с ними желаемого результата. –

+0

Попробуйте использовать предложение 'LIMIT'. –

+0

Могу ли я ограничить самую последнюю дату? – Jimbob

ответ

4

Попробуйте:

### 
SELECT * FROM categories c 
LEFT JOIN topics t ON c.cat_id = t.topic_cat 
WHERE c.cat_id IN (SELECT t1.cat_id FROM (
    SELECT c.cat_id, c.cat_name, MAX(t.topic_date) AS maxdate FROM categories c 
    LEFT JOIN topics t ON c.cat_id = t.topic_cat 
    GROUP BY c.cat_name 
) as t1 WHERE t1.maxdate = t.topic_date OR t.topic_date IS NULL); 

### without nulls 
SELECT * FROM categories c 
    LEFT JOIN topics t ON c.cat_id = t.topic_cat 
    WHERE c.cat_id IN (SELECT t1.cat_id FROM (
    SELECT c.cat_id, c.cat_name, MAX(t.topic_date) AS maxdate FROM categories c 
    LEFT JOIN topics t ON c.cat_id = t.topic_cat 
    GROUP BY c.cat_name 
) as t1 WHERE t1.maxdate = t.topic_date); 
1

Попробуйте изменить

LEFT JOIN (SELECT topic_subject, topic_cat, topic_date, topic_by 
FROM topics 
GROUP BY topic_cat DESC) AS topics 

к:

LEFT JOIN (SELECT topic_subject, topic_cat, topic_date, topic_by 
FROM topics 
GROUP BY topic_cat 
ORDER BY topic_date DESC 
LIMIT 0,1) AS topics 
Смежные вопросы