MySQL查询限制

标签 mysql sql select group-by greatest-n-per-group

我有一个用于计算金钱的 MySQL 数据库。我有两个表:balance 和 money。

在 money 表中有两列:id(即 AUTO_INCREMENT 和 PRIMARY)和 name。该表现在包含:

1 | Card
2 | Cash

余额表中有三列:id(即AUTO_INCREMENT和PRIMARY)、balance、time和money_id。该表现在包含:

1 | 200 | 2014-01-03 03:04:00 | 2
2 | 150 | 2014-01-03 03:08:00 | 2
3 | 400 | 2014-01-03 03:10:00 | 1
4 | 300 | 2014-01-03 03:12:00 | 1
5 | 100 | 2014-01-03 03:14:00 | 2
5 | 150 | 2014-01-03 03:16:00 | 2

所以此时有100现金和300卡。我想要一个显示该内容的页面,例如:

Cash 100
Card 300

但是我在为此创建查询时遇到了问题。我有一个查询,但它不起作用:

SELECT 
    money.name, 
    balance.balance, 
    balance.time, 
    money.id, 
    balance.id 
FROM 
    money, 
    balance 
WHERE 
    money.id = balance.money_id 
ORDER BY 
    balance.time DESC

这将打印:

Cash 150
Cash 100
Card 300
Card 400
Cash 150
Cash 200

但我只希望每个 money.name 有一个值,而且是按 balance.time 排序的值。我试过限制 1,但它只打印:

Cash 150

限制 2 也不起作用,因为它打印:

Cash 150
Cash 100

有什么想法吗?

抱歉英语不好,那不是我的母语。 :D

最佳答案

试试这个:

SELECT m.name, b.balance
FROM money m
INNER JOIN balance b ON m.id = b.money_id 
INNER JOIN (SELECT b.money_id, MAX(b.time) AS `time` 
            FROM balance b 
            GROUP BY b.money_id
           ) AS A ON b.money_id = A.money_id AND b.time = A.time;

检查 SQL FIDDLE DEMO

输出

| ID | NAME | BALANCE |
|----|------|---------|
|  1 | Card |     300 |
|  2 | Cash |     150 |

关于MySQL查询限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27801180/

相关文章:

mysql - 如果表存在 SQL 则删除行

sql - 带SUM的GROUP BY,不会删除空(空)值

sql - MySQL-单条语句查询复杂数据

mysql - 获取 SELECT 语句以使用 STR_TO_DATE

mysql - 如何合并两个具有相同架构的 mysql 数据库?

mysql - JTable 的编辑按钮,用于编辑数据库内容 生成

php - mysql多JOIN查询优化

mysql - 在单个查询中按多个日期范围聚合列

mysql - 如何编写这个 SELECT 语句的代码?

sql - 在 postgres 中创建一个范围