从MAX(ID)和MIN(ID) MYSQL查询中获取更多信息?

7

如何从MAX(ID), MIN(ID) MYSQL查询中获取更多列?

目前我只能从这个查询中获得两个值:MAX(ID)和MIN(ID)

SELECT MIN(ID), MAX(ID) FROM mytable WHERE mytable.series = 'white' ;

需要像这样的伪查询来获得更多内容:

SELECT  column1, column2
FROM    mytable 
WHERE   series = 'white'
AND ID=Max(ID)
'AND GET ME ALSO'
WHERE   series = 'white'
AND ID=Min(ID);`

查询列'series'等于'white'的行,应该返回2行。

第一行是ID=最小(ID)时的column1和column2。 第二行是ID=最大(ID)时的column1和column2。

但是如何实现呢?

3个回答

6

这里提供了一种使用 UNION 的方法:

SELECT column1, column2
FROM mytable
WHERE series = 'white' AND ID IN
(    
    SELECT MIN(ID) FROM mytable WHERE series = 'white'
    UNION
    SELECT MAX(ID) FROM mytable WHERE series = 'white'
)

为了获得更好的性能,在(series, id)上添加一个组合索引。

或者另一种可能具有更好性能的变体:

(
    SELECT column1, column2
    FROM mytable
    WHERE series = 'white'
    ORDER BY ID
    LIMIT 1
)
UNION
(
    SELECT column1, column2
    FROM mytable
    WHERE series = 'white'
    ORDER BY ID DESC
    LIMIT 1
)

这也可以使用联合索引(series, id)


这个可以运行,但是处理5000行数据需要1分39秒...这正常吗? - Ash501
1
@Ash501:那肯定不正常。你忘记加索引了吗?我已经更新了我的答案,包含一个索引建议。但是,即使没有索引,对于5000行,我认为它应该比那个快得多。你的数据库服务器性能不足或负载过重吗?你能否更新你的问题,提到性能是一个问题,并包括“SHOW CREATE TABLE ...”的输出结果和“EXPLAIN SELECT”的结果? - Mark Byers
1
@Ash501,这是因为子查询很慢,因为MySQL必须为每一行执行它们。他的第二个解决方案应该更快,前提是您设置了正确的索引。 - Zane Bien
@ZaneBien:说“MySQL中子查询很慢”是一种概括。确实,在旧版本的MySQL中,当没有索引时,在IN表达式内部的子查询可能会很慢,但是:a)在最新的MySQL中已经修复了这个bug,并且添加索引(无论如何都应该添加)将解决问题。 - Mark Byers
1
@Ash501:12 仍然太慢了。如果是 12 毫秒 而不是秒,那么这就是我所期望的速度。关于您的说法“需要对 'series' 进行索引-'id' 已经被索引了。”-这是错误的。您应该在 (series, id) 上添加一个组合索引。 即使 seriesid 或两者都已经分别建立了索引,也应该添加这个组合索引。 组合索引与单独索引列是不同的。 - Mark Byers
显示剩余3条评论

4
一个更简单的解决方案:
SELECT a.column1, a.column2
FROM   mytable a
JOIN   (
       SELECT MIN(ID) AS minid, MAX(ID) AS maxid
       FROM   mytable
       WHERE  series = 'white'
       ) b ON a.ID IN (b.minid, b.maxid)

0

就像您所说的一样:

SELECT
  column1, column2
FROM 
  mytable as m, 
  (SELECT MIN(ID) as mid, MAX(ID) as xid 
   FROM mytable WHERE mytable.series = 'white'
   ) t
WHERE 
  m.ID = t.mid or m.ID = t.xid;

括号中的 SELECT 是内部查询,您可以像其他表格一样使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接