【问题标题】:MySQL join query with only one record from joined table, ordered by dateMySQL 连接查询,连接表中只有一条记录,按日期排序
【发布时间】:2013-08-11 05:45:45
【问题描述】:

我在 MySQL 中有两个表,我想加入一个查询。

表一 opc_tag:

id name

表二 opc_data:

id tag_id value created_at

我想根据“created_at”字段列出 opc_tag 中的所有行以及 opc_data 中的最后一条记录。

我尝试在 Google 上找到它,但它不起作用。 以下查询从 opc_data-table 中选择了具有多条记录的标签。

SELECT t.*, d.*
FROM opc_tag t LEFT JOIN opc_data d ON t.id = d.tag_id
WHERE d.created_at = (
    SELECT MAX(d.created_at)
    FROM opc_data d2
    WHERE d2.tag_id = t.id
)

【问题讨论】:

  • 您好,欢迎来到 stackoverflow。由于您的问题可能不像我们最初想象的那么简单,您或许应该编辑您的问题以显示实际输入数据的 exampleexpected 输出。完成后,在等待答案时,您应该查看我们的帮助:stackoverflow.com/help/someone-answers

标签: mysql sql


【解决方案1】:

我认为这样做可以:

SELECT t.*,d.* FROM opc_tag t 
LEFT JOIN opc_data d ON t.id = d.tag_id
WHERE d.created_at = (
    SELECT MAX(created_at) FROM opc_data WHERE tag_id = t.id
)
GROUP BY t.id

如果你想显示所有标签,即使是没有数据的标签,在 where 子句中使用:

WHERE d.created_at = (
    SELECT MAX(created_at) FROM opc_data WHERE tag_id = t.id
) OR d.created_at IS NULL

【讨论】:

    【解决方案2】:

    试试这个,它将获取ORDER BY created_at DESC LIMIT 1opc_data中输入的最后一个tag_id,并从opc_tag返回针对tag_id的数据

    SELECT *
    FROM opc_tag 
    WHERE id= (
        SELECT tag_id
        FROM opc_data 
       ORDER BY created_at DESC LIMIT 1 
    )
    

    【讨论】:

    • 添加子查询t.id = d.tag_id
    • 当我运行该查询时,我只从 opc_tag 获得了一条记录(最后一条),但没有 opc_data 字段。我需要该表中的 value 字段和 created_at 字段。
    • 这是您要求的我想根据“created_at”字段列出 opc_tag 中的所有行以及 opc_data 中的最后一条记录
    猜你喜欢
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2020-08-08
    相关资源
    最近更新 更多