相关疑难解决方法(0)

选择每个GROUP BY组中的第一行?

正如标题所示,我想选择用a组成的每组行的第一行GROUP BY.

具体来说,如果我有一个purchases看起来像这样的表:

SELECT * FROM purchases;
Run Code Online (Sandbox Code Playgroud)

我的输出:

id | customer | total
---+----------+------
 1 | Joe      | 5
 2 | Sally    | 3
 3 | Joe      | 2
 4 | Sally    | 1

我想查询每个产品id的最大购买量(total)customer.像这样的东西:

SELECT FIRST(id), customer, FIRST(total)
FROM  purchases
GROUP BY customer
ORDER BY total DESC;
Run Code Online (Sandbox Code Playgroud)

预期产出:

FIRST(id) | customer | FIRST(total)
----------+----------+-------------
        1 | Joe      | 5
        2 | Sally    | 3

sql sqlite postgresql group-by greatest-n-per-group

1205
推荐指数
16
解决办法
95万
查看次数

为什么MySQL允许"分组"查询没有聚合函数?

惊喜 - 这是MySQL中完全有效的查询:

select X, Y from someTable group by X
Run Code Online (Sandbox Code Playgroud)

如果您在Oracle或SQL Server中尝试过此查询,则会收到自然错误消息:

Column 'Y' is invalid in the select list because it is not contained in 
either an aggregate function or the GROUP BY clause.
Run Code Online (Sandbox Code Playgroud)

那么MySQL如何确定每个X显示哪个Y?它只选了一个.据我所知,它只是挑选它找到的第一个Y. 理由是,如果Y既不是聚合函数也不是group by子句,那么在查询中指定"select Y"就没有意义.因此,我作为数据库引擎将返回我想要的任何内容,你会喜欢它.

甚至还有一个MySQL配置参数来关闭这种"松散". http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

本文甚至提到MySQL在这方面如何被批评为ANSI-SQL不兼容. http://www.oreillynet.com/databases/blog/2007/05/debunking_group_by_myths.html

我的问题是: 为什么 MySQL是这样设计的?打破ANSI-SQL的理由是什么?

mysql sql standards-compliance ansi-sql

59
推荐指数
2
解决办法
2万
查看次数

MySQL - 选择所有列WHERE一列是DISTINCT

如果问题看起来太基础,我很抱歉.
我已经浏览了整个互联网和StackOverflow以获得完整的解决方案,并没有找到任何我能理解的内容,也无法自己编写,所以不得不在这里问一下.

我有一个MySQL数据库.
它有一个名为"已发布"的表.
它有8列.

我需要输出这个结果:

SELECT DISTINCT link FROM posted WHERE ad='$key' ORDER BY day, month
Run Code Online (Sandbox Code Playgroud)

但我不仅需要"链接"列,还需要此行的其他列.
对于使用此查询返回的每一行,我还需要知道表中的"id","day"和"month"值等.

请告诉我应该阅读什么,或如何制作它.
请保持尽可能简单,因为我不是MySQL的专家.

编辑:我试过这个:

SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month
Run Code Online (Sandbox Code Playgroud)

它不起作用.它返回太多行.假设有10行具有相同的链接,但不同的日/月/ ID.这个脚本将返回全部10个,我只想要第一个(对于这个链接).

mysql sql

52
推荐指数
4
解决办法
14万
查看次数

选择组中的第一个和最后一个值

我有一个MySql表,包括每日股票报价(开盘价,最高价,最低价,收盘价和成交量),我试图将其转换为每周数据.到目前为止,我有以下功能,适用于高,低和音量:

SELECT MIN(_low), MAX(_high), AVG(_volume),
CONCAT(YEAR(_date), "-", WEEK(_date)) AS myweek
FROM mystockdata
GROUP BY myweek
ORDER BY _date;
Run Code Online (Sandbox Code Playgroud)

我需要在上面的查询中选择_open的第一个实例.因此,例如,如果星期一(在特定的一周)有假期并且星期二开放股票市场,则应该从星期二开始选择_开值,该星期二分组为其周.同样,close值应该是该周的最后一个_close.

是否可以在MySql中选择类似FIRST()和LAST()的内容,以便上述内容可以包含在单个SELECT中而不是使用嵌套的选择查询?

这是我的表的create语句,用于了解模式:

delimiter $$
CREATE TABLE `mystockdata` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `symbol_id` int(11) NOT NULL,
  `_open` decimal(11,2) NOT NULL,
  `_high` decimal(11,2) NOT NULL,
  `_low` decimal(11,2) NOT NULL,
  `_close` decimal(11,2) NOT NULL,
  `_volume` bigint(20) NOT NULL,
  `add_date` date NOT NULL,
  PRIMARY KEY (`id`),
  KEY `Symbol_Id` (`symbol_id`,`add_date`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8$$
Run Code Online (Sandbox Code Playgroud)

更新:没有空值,无论何处有假期/周末,该表都没有该日期的任何记录.

mysql select group-by

23
推荐指数
2
解决办法
4万
查看次数

在MySQL中返回每个'group by'的'last'行

有更有效的方法来做以下事情吗?

select * 
    from foo as a
    where a.id = (select max(id) from foo where uid = a.uid group by uid)
    group by uid;
)
Run Code Online (Sandbox Code Playgroud)

这个答案看起来很相似,但这个答案是最好的方法 - 如何为MySQL中的每个组选择第一行?

谢谢,

克里斯.

PS表格如下:

CREATE TABLE foo (
    id INT(10) NOT NULL AUTO_INCREMENT,
    uid INT(10) NOT NULL,
    value VARCHAR(50) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `uid` (`uid`)
)
Run Code Online (Sandbox Code Playgroud)

数据:

id, uid, value
 1,   1, hello
 2,   2, cheese
 3,   2, pickle
 4,   1, world
Run Code Online (Sandbox Code Playgroud)

结果:

id, uid, value
 3,   2, pickle
 4,   1, …
Run Code Online (Sandbox Code Playgroud)

mysql group-by

15
推荐指数
2
解决办法
5万
查看次数

SQL选择不同的子串,其中像muddleup howto

我有一个表格,其字段类似于:

ANIMAL
========
FISH 54
FISH 30
DOG 12
CAT 65
CAT 09
BIRD 10
FISH 31
DOG 10
Run Code Online (Sandbox Code Playgroud)

该领域可能后来添加了新的动物,例如

GOAT 72
DOG 20
Run Code Online (Sandbox Code Playgroud)

我想做的是创建一个SELECT查询,每个动物名称返回一个唯一的行,返回一个数据集,每个动物类型一行,我可以稍后解析,以列出我的表中的动物列表.

所以,在魔术之后,我会有

FISH 54
DOG 12
CAT 65
BIRD 10
GOAT 72
Run Code Online (Sandbox Code Playgroud)

...我将从中列出我的名单.

到目前为止,我一直得过且过周围的子查询,SELECT DISTINCT以及SUBSTRING(),但我觉得,任何结果我想出了大概会相比,SO蜂房头脑的威力苍白.有人可以帮忙吗?

UPDATE

如果它有帮助,我失败的尝试有点说明了我想做的事情:

SELECT DISTINCT substring(animal,1,4) FROM table;
Run Code Online (Sandbox Code Playgroud)

只是现在我没有全名,只是一个子串.:(

sql select substring max distinct

5
推荐指数
1
解决办法
2万
查看次数

在 MySQL 中为每个组选择第一行?

我有一个小表,大约有 700 条记录。我想选择每组的第一条记录。

查询如下

SELECT *
FROM release_image ri
ORDER BY ri.release_id, ri.position DESC
Run Code Online (Sandbox Code Playgroud)

结果集如下图所示。正如你所看到的,我想选择每组中的第一个,它应该是:

release_id  image_id   position
------------------------------------
1           1809      3
2           1010      1
3           2240      2
4           2245      2
...
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

在此输入图像描述

mysql

3
推荐指数
1
解决办法
1万
查看次数