MYSQL JOIN 两个表按日期限制第二个表的结果

标签 mysql sql select join

我正在尝试使用 MYSQL 查询从两个表中检索日期。我想将它们加入 categories.cat_id=topics.topic_cat。多个条目可能具有相同的 topic_cat,因此我只想选择最新的,它等于 MAX(topic_date)

以下查询显示来自主题的正确信息,每个 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;

这个查询显示了正确的信息,除了一件事。它显示具有最旧条目或 MIN(topic_date) 的 topic_cat。我尝试了以下方法以通过最新条目或 MAX(topic_date) 获取 topic_cat,但没有成功。

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         |
----------------------------------------------------------------------------------------------------------------

我希望这能澄清一些事情。

最佳答案

试试这个:

###
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);

关于MYSQL JOIN 两个表按日期限制第二个表的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19085001/

相关文章:

MYSQL 使用空间索引

sql - 任何想法为什么这个连接查询执行表扫描,如果有办法我可以消除它?

java - 在Java中连接多行SQL语句的有效方法?

javascript - 搜索克隆选择对象的选项值并设置选择(如果存在)

c# - Linq 从两个表中选择按列表排序

php - 使用 PHP 显示 SQL 数据库中的一行

mysql - 如何在 mysql 查询中从每个组中选择多个项目?

mysql - 如何在 PHP 中将 MSSQL 日期转换为 MySQL 日期

Java 连接到 MySql 数据库,NullPointerException

sql - 如何处理有结果的 ADO 查询与无结果的查询?