【问题标题】:Mysql query: combine two queriesMysql查询:组合两个查询
【发布时间】:2010-05-30 12:52:19
【问题描述】:

下面是我正在使用的表格的过度简化版本:

水果 +-------+----------+ |编号 |类型 | +-------+----------+ | 1 |苹果| 高分辨率照片| CLIPARTO | 2 |橙色 | | 3 |香蕉| 高分辨率照片| CLIPARTO | 4 |苹果| 高分辨率照片| CLIPARTO | 5 |苹果| 高分辨率照片| CLIPARTO | 6 |苹果| 高分辨率照片| CLIPARTO | 7 |橙色 | | 8 |苹果| 高分辨率照片| CLIPARTO | 9 |苹果| 高分辨率照片| CLIPARTO | 10 |香蕉| 高分辨率照片| CLIPARTO +-------+----------+

以下是感兴趣的两个查询:

SELECT * FROM fruits WHERE type='apple' LIMIT 2;

SELECT COUNT(*) AS total FROM fruits WHERE type='apple'; // output 6

我想组合这两个查询,结果如下所示:

+-------+---------+---------+ |编号 |类型 |总计| +-------+---------+---------+ | 1 |苹果| 高分辨率照片| CLIPARTO 6 | | 4 |苹果| 高分辨率照片| CLIPARTO 6 | +-------+---------+---------+

输出必须限制为 2 条记录,但它还应包含 apple 类型的记录总数。

如何通过 1 个查询来完成?

【问题讨论】:

  • 这样查询的目的是什么?
  • 这是我正在使用的表的精简版本,它将有超过一百万条记录,并且缺少其他 5 列。为了简单起见,我放了这张表。现在我正在使用 2 个查询,但想知道如何通过 1 个查询来实现(用于学习目的)
  • 看起来你过于简单化了,它可能会误导那些试图回答的人。就我个人而言,我更喜欢明智的问题。

标签: sql mysql join subquery


【解决方案1】:
SELECT *, (SELECT COUNT(*) AS total FROM fruits WHERE type='apple') AS Total 
FROM fruits WHERE type='apple' LIMIT 2;

根据 MySQL 的解释方式,它可能会缓存内部查询,这样它就不必为每条记录重新评估它。

另一种方法是使用嵌套查询和连接(例如,如果您需要多种水果类型,这将很有用):

SELECT fruits.*, counts.total
FROM fruits 
  INNER JOIN (SELECT type, COUNT(*) AS total FROM fruits GROUP BY type) counts ON (fruits.type = counts.type)
WHERE fruits.type='apple'
LIMIT 2;

【讨论】:

  • 嘿@Lost,你当前的两个查询不是比这个怪物简单吗? ;)
  • @col:也许吧。但我很想学习用 1 个查询来做到这一点。是的,虽然它可能看起来不漂亮,但我更喜欢使用 1 个查询而不是 2 个。
  • @Lost 你就错了。这样做没有任何好处。
  • @col: 哈哈,这个查询简直是小菜一碟……看看我最近写的这些野兽之一:stackoverflow.com/questions/2938427/…stackoverflow.com/questions/2776632/…
【解决方案2】:

您应该为此使用SQL_CALC_FOUND_ROWS

SELECT SQL_CALC_FOUND_ROWS * FROM fruits WHERE type='apple' LIMIT 2;

将返回您的苹果的 ID,并记住如果没有 LIMIT 子句它会返回多少

SELECT FOUND_ROWS();

将返回找到的苹果数量,没有限制语句。

【讨论】:

  • 您应该将 SQL_CALC_FOUND_ROWS 放在条件 cmets 中,以允许在不支持它的 SQL 服务器上正常失败。
猜你喜欢
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 2019-05-06
  • 2021-05-02
  • 2012-04-22
  • 2015-01-31
相关资源
最近更新 更多