mysql 联合查询 如何查询从表的最后一条记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 联合查询 如何查询从表的最后一条记录相关的知识,希望对你有一定的参考价值。

主表(table1)数据格式:
---------------

id | name

1 | 小明
---------------

从表(table2)数据格式:
----------------------------

id | table1_id | title

1 | 1 | 吃包子
2 | 1 | 喝汤
-----------------------------

必须 table1 为主表,查询出小明最后一次在干啥。当然数据有N多。。 不能只限于小明

    将主表与从表进行连接查询 join

    从表中用创建时间或其他时间字段进行排序

    将查询的结果用LIMIT取出第一条数据即可

参考技术A

1 先看两个表 SP01,JS2

2 联合查询从表的最后一条信息

参考技术B

    连接查询

    从表按 某个字段倒叙排列

    limit 取一条记录

    SELECT * FROM table1 t1

    LEFT JOIN

    (SELECT t2.* FROM table1 t1

    LEFT JOIN  table2  t2 on t1.id=t2.table1_id

    ORDER BY table2.time limit 1)t on t1.id=t.table1_id

    从表添加一个时间字段

参考技术C 将查询结果倒序排列,然后取第一行就是你要的结果喽
select a.name,b.title from table1 a
left join table2 b on a.id = b.table1_id
order by title
limit 1

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

【中文标题】如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?【英文标题】:How to fetch the first and last record of a grouped record in a MySQL query with aggregate functions? 【发布时间】:2010-11-25 15:49:49 【问题描述】:

我正在尝试获取“分组”记录的第一条和最后一条记录。 更准确地说,我正在做这样的查询

SELECT MIN(low_price), MAX(high_price), open, close
FROM symbols
WHERE date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)

但我想获得该组的第一条和最后一条记录。可以通过执行大量请求来完成,但我有一张很大的桌子。

是否有一种(如果可能的话,处理时间较短)方法可以用 MySQL 做到这一点?

【问题讨论】:

效率更高,见mysql.rjweb.org/doc.php/groupwise_max 【参考方案1】:

你想使用GROUP_CONCATSUBSTRING_INDEX

SUBSTRING_INDEX( GROUP_CONCAT(CAST(open AS CHAR) ORDER BY datetime), ',', 1 ) AS open
SUBSTRING_INDEX( GROUP_CONCAT(CAST(close AS CHAR) ORDER BY datetime DESC), ',', 1 ) AS close 

这避免了昂贵的子查询,我发现它通常更有效地解决这个特定问题。

查看这两个函数的手册页以了解它们的参数,或访问本文,其中包含如何执行 timeframe conversion in MySQL 的示例以获取更多说明。

【讨论】:

感谢您的巧妙解决方案!尽管如此,我还是很遗憾 MySQL 不支持 FIRST() 和 LAST(),这会比这快得多... 优秀的解决方案。我想知道大型表的性能和内存注意事项,直到我看到操作限制在group_concat_max_len 定义的大小(默认为 1024)。美好时光! 所有子查询的性能不一样。很明显,不得不说很尴尬,但它在很大程度上依赖于子查询和它所嵌入的查询。以及不相关的子查询,(其中子查询的执行不依赖于每一行外部查询)并不比单独运行时更差(或更好)。因为下面我的解决方案中的子查询是... 我的问题的最佳解决方案,我看了很多!谢谢!避免讨厌的子查询或自联接。 你能写出完整的查询吗?谢谢【参考方案2】:

试试这个从...开始:

Select YearWeek, Date, Min(Low_Price), Max(High_Price)
From
   (Select YEARWEEK(date) YearWeek, Date, LowPrice, High_Price
    From Symbols S
    Where Date BETWEEN(.. ..)
    GROUP BY YEARWEEK(date)) Z
Group By YearWeek, Date

【讨论】:

【参考方案3】:

这是针对这个特定问题的一个很好的特定解决方案: http://topwebguy.com/first-and-last-in-mysql-a-working-solution/ 这几乎就像在 MySQL 中使用 FIRST 和 LAST 一样简单。

我将包含实际提供解决方案的代码,但您可以查看全文:

SELECT
word ,  

(SELECT a.ip_addr FROM article a
WHERE a.word = article.word
ORDER BY a.updated  LIMIT 1) AS first_ip,

(SELECT a.ip_addr FROM article a
WHERE a.word = article.word
ORDER BY a.updated DESC LIMIT 1) AS last_ip

FROM notfound GROUP BY word;

【讨论】:

【参考方案4】:

假设您想要具有最低 low_price 和最高 high_price 的记录的 ID,您可以将这两列添加到您的查询中,

SELECT 

(SELECT id ORDER BY low_price ASC LIMIT 1) low_price_id,
(SELECT id ORDER BY high_price DESC LIMIT 1) high_price_id,

MIN(low_price), MAX(high_price), open, close
FROM symbols
WHERE date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)

如果效率是一个问题,您应该为“year_week”添加一列,添加一些覆盖索引,并将查询一分为二。

“year_week”列只是一个设置为 YEARWEEK(date) 值的 INT,并在“date”列更新时更新。这样您就不必为每个查询重新计算它,您可以对其进行索引。

新的覆盖索引应如下所示。顺序很重要。 KEY yw_lp_id (year_week, low_price, id), KEY yw_hp_id (year_week, high_price, id)

然后你应该使用这两个查询

SELECT 
(SELECT id ORDER BY low_price ASC LIMIT 1) low_price_id,
MIN(low_price), open, close
FROM symbols
WHERE year_week BETWEEN(.. ..)
GROUP BY year_week

SELECT 
(SELECT id ORDER BY high_price DESC LIMIT 1) high_price_id,
MAX(high_price), open, close
FROM symbols
WHERE year_week BETWEEN(.. ..)
GROUP BY year_week

覆盖索引非常有用。查看this了解更多详情。

【讨论】:

以上是关于mysql 联合查询 如何查询从表的最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章

一条sql 俩个表级联查询的语句,我想只显示前七条,从表有一个字段是和主表对应的。要求一起显示。。。。

MySQL怎么写存储过程查询某个表的某一条记录,并把这条记录的所有列名对应的值以json格式返回呢?

如何使用 laravel 查询生成器从表联合的结果中选择列?

mysql 查询符合条件的 最后一条

如何通过两个表中超过 750,000 条记录的两个表的联合来优化 mysql 查询?

sql 一对多的查询