【问题标题】:Why does group by and sort by give 0 response为什么 group by 和 sort by 给出 0 响应
【发布时间】:2017-07-23 21:32:21
【问题描述】:

这个查询的结果给了我 0 行,它应该给我 3 最新的行(按 Table1.Name 分组)。 表 1 有:“名称”、“时间戳”、“电压”。 表 2 有:“名称”、“数据”。

当我删除“ORDER BY Table1.Timestamp”时,我确实得到了 3 行(如预期的那样),但它们是数据库中最旧的 3 个条目,我想要 3 个最新的条目。 (我在 Table1 和 Table2 中有 3 个 Name 值匹配)。

代码:

SELECT * from Table1
INNER JOIN Table2
ON Table1.Name=Table2.Name
GROUP BY Table1.Name
ORDER BY Table1.Timestamp;

【问题讨论】:

  • “但它们是数据库中最旧的 3 个条目,我想要 3 个最新的条目。” -- 这不是 @ 的工作987654324@。 GROUP BY 不从数据库返回行。它使用数据库中的值生成它返回的值。
  • 搜索带有greatest-n-per-group标签的类似问题。
  • 如果你还在苦苦挣扎,请看meta.stackoverflow.com/questions/333952/…

标签: mysql group-by sql-order-by


【解决方案1】:

您可以尝试执行这样的查询:

SELECT t.*,t2.* from Table1 t
INNER JOIN Table2 t2
ON t.Name=t2.Name
WHERE t.Timestamp = (
    SELECT MAX(t3.Timestamp) FROM Table1 t3
    WHERE t3.Name = t.Name
)

【讨论】:

  • @GuillaumeSTLR 你的代码有效!!太感谢了。你知道为什么处理需要大约 20 秒吗?
  • 这取决于数据库中的行数。尝试删除 GROUP BY 语句!
  • 我只有 4000 行。
  • 您可以在 Name 和 Timestamp 列上放置索引 ;-)
  • @GuillaumeSTLR 再次感谢您的帮助!!赞!!我无法检索 Table2.data 字段。您知道如何将 Table2.data 添加到查询结果中吗?
【解决方案2】:

您可以排序并获得前 3 名:

SELECT * from Table1
INNER JOIN Table2
ON Table1.Name=Table2.Name
ORDER BY Table1.Timestamp DESC
LIMIT 3

【讨论】:

    【解决方案3】:

    当您使用连接两个或多个表时,请勿在选择查询中使用 *。使用特定的列名来避免选择查询中的列不明确,您也可以使用 Table1.、Table2.,但是在选择查询中使用特定列的好方法。

    SELECT Table1.Name,Table1.Timestamp from Table1 内连接表2 ON Table1.Name=Table2.Name GROUP BY Table1.Name ORDER BY Table1.Timestamp;

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 2023-04-07
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多