小编Ric*_*mes的帖子

SQL仅选择列上具有最大值的行

我有这个文件表(这里是简化版):

+------+-------+--------------------------------------+
| id   | rev   | content                              |
+------+-------+--------------------------------------+
| 1    | 1     | ...                                  |
| 2    | 1     | ...                                  |
| 1    | 2     | ...                                  |
| 1    | 3     | ...                                  |
+------+-------+--------------------------------------+
Run Code Online (Sandbox Code Playgroud)

如何为每个id选择一行并且只选择最大转速?
使用上面的数据,结果应该包含两行:[1, 3, ...][2, 1, ..].我正在使用MySQL.

目前,我在while循环中使用检查来检测并覆盖结果集中的旧转速.但这是实现结果的唯一方法吗?是不是有SQL解决方案?

更新
作为答案提示,有一个SQL的解决方案,并且这里sqlfiddle演示.

更新2
我注意到在添加上述sqlfiddle之后,问题被投票的速率超过了答案的upvote率.那不是故意的!小提琴是基于答案,特别是接受的答案.

mysql sql aggregate-functions greatest-n-per-group groupwise-maximum

1142
推荐指数
14
解决办法
107万
查看次数

LEFT JOIN仅第一行

我读了许多关于只获得左连接的第一行的线程,但是,由于某种原因,这对我不起作用.

这是我的结构(当然简化)

饲料

id |  title | content
----------------------
1  | Feed 1 | ...
Run Code Online (Sandbox Code Playgroud)

艺术家

artist_id | artist_name
-----------------------
1         | Artist 1
2         | Artist 2
Run Code Online (Sandbox Code Playgroud)

feeds_artists

rel_id | artist_id | feed_id
----------------------------
1      |     1     |    1 
2      |     2     |    1 
...
Run Code Online (Sandbox Code Playgroud)

现在我想获得文章并加入第一位艺术家,我想到了这样的事情:

SELECT *
    FROM feeds 
    LEFT JOIN feeds_artists ON wp_feeds.id = (
        SELECT feeds_artists.feed_id FROM feeds_artists
        WHERE feeds_artists.feed_id = feeds.id 
    LIMIT 1
    )
WHERE feeds.id = '13815'
Run Code Online (Sandbox Code Playgroud)

只是为了获得feed_artists的第一行,但这已经不起作用了.

我无法使用TOP因为我的数据库而且我无法对结果进行分组,feeds_artists.artist_id因为我需要按日期对它们进行排序(我通过这种方式对结果进行分组,但结果不是最新的)

用OUTER …

mysql join left-join groupwise-maximum

125
推荐指数
4
解决办法
17万
查看次数

#1273 - 未知校对:'utf8mb4_unicode_520_ci'

我在我的本地WAMP服务器上有一个WordPress网站.但是当我将其数据库上传到实时服务器时,我收到错误

#1273 – Unknown collation: ‘utf8mb4_unicode_520_ci’
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激!

mysql sql wordpress collation

120
推荐指数
14
解决办法
22万
查看次数

UTF-8字符有问题; 我看到的不是我存储的东西

我试图使用UTF-8并遇到麻烦.

我尝试了很多东西; 这是我得到的结果:

  • ????而不是亚洲人物.即使是欧洲文本,我也得到Se?orSeñor.
  • 奇怪的胡言乱语(Mojibake?)如Señor新浪新闻????.
  • 黑色钻石,如Se or.
  • 最后,我陷入了数据丢失或至少被截断的情况:Sefor Señor.
  • 即使我看到正确的文字,它也没有正确排序.

我究竟做错了什么?我该如何修复代码?我可以恢复数据,如果是,如何恢复?

mysql unicode utf-8 character-encoding mariadb

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

MySQL - SELECT中的同时浮点递增和赋值在5.6之前中断

像查询为什么SELECT (@sum:=(@var:=@sum)+some_table.val)...自动转换(@var:=@sum)到整数MySQL的≤5.5为DECIMALsome_table.val和地板它DOUBLE/FLOAT?更改了哪些功能以允许5.6中的预期行为?


背景与细化:

请考虑下表:

CREATE TABLE t ( 
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    sum_component FLOAT 
);
INSERT INTO t (sum_component) VALUES (0.5), (0.6), (0.4), (0.5);
Run Code Online (Sandbox Code Playgroud)

我正在设计一个累积和查询,它获取id累积和大于某个值的条目.通常,此查询符合条例草案:

SELECT t.id, 
    @cumulative_sum
    FROM t 
    CROSS JOIN (SELECT @cumulative_sum:=0) a 
    WHERE (@cumulative_sum:=@cumulative_sum+t.sum_component) > 1.3 
    ORDER BY id ASC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

...但我碰巧还需要在所选条目之前存储累积总和以及以后的计算,并且cumulative_sum从该查询中不返回预期结果,重复计算最后一个条目.在这种情况下,我希望此查询设置一个存储value 1.1(0.5 + 0.6)的变量,而不必进行额外的数学运算.

如果我在增量步骤中指定@cumulative_sumto 的旧值@another_variable,我应该能够做到这一点.

SELECT t.id, 
    @cumulative_sum …
Run Code Online (Sandbox Code Playgroud)

mysql select mariadb

15
推荐指数
1
解决办法
294
查看次数

如何配置Spring启动以使用两个数据库?

我使用Spring Boot 2.XHibernate 5 在不同的服务器上连接两个不同的MySQL数据库(Bar和Foo).我试图从REST控制器中的方法列出实体的所有信息(自己的属性@OneToMany@ManyToOne关系).

我已经按照几个教程来执行此操作,因此,我能够获取我的@Primary数据库(Foo)的所有信息,但是,在检索@OneToMany集合时,我总是得到我的辅助数据库(Bar)的例外.如果我将@Primary注释交换到Bar数据库,我可以从Bar数据库获取数据,但不能从Foo数据库获取数据.有办法解决这个问题吗?

这是我得到的例外:

...w.s.m.s.DefaultHandlerExceptionResolver :
Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: 
    Could not write JSON document: failed to lazily initialize a collection of role: 
        com.foobar.bar.domain.Bar.manyBars, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]-com.foobar.bar.domain.Bar["manyBars"]); 
    nested exception is com.fasterxml.jackson.databind.JsonMappingException:
        failed to lazily initialize a collection of role: 
        com.foobar.bar.domain.Bar.manyBars, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.foobar.bar.domain.Bar["manyBars"])
Run Code Online (Sandbox Code Playgroud)

我的application.properties:

# …
Run Code Online (Sandbox Code Playgroud)

java mysql spring hibernate spring-boot

12
推荐指数
1
解决办法
2203
查看次数

如何使用持久连接在AWS中处理PDO MySQL故障转移

我们遇到了AWS Aurora故障转移问题,并正在寻找解决方法的指针。

情境

AWS Aurora设置了两个端点:

  • 作家:
    • 主机:stackName-dbcluster-ID.cluster-ID.us-west-2.rds.amazonaws.com
    • 解析为IP:10.1.0.X
  • 读者:
    • 主机:stackName-dbcluster-ID.cluster-ro-ID.us-west-2.rds.amazonaws.com
    • 解析为IP:10.1.0.Y

因此,我们的PDO MySQL连接字符串为stackName-dbcluster-ID.cluster-ID.us-west-2.rds.amazonaws.com(用于编写)

故障转移后

故障转移时,DNS条目将翻转为指向以下位置:

  • 读者:
    • 主机:stackName-dbcluster-ID.cluster-ro-ID.us-west-2.rds.amazonaws.com
    • 解析为IP:10.1.0.X
  • 作家:
    • 主机:stackName-dbcluster-ID.cluster-ID.us-west-2.rds.amazonaws.com
    • 解析为IP:10.1.0.Y

至关重要的是,PDO连接字符串(用于写入)仍然是相同的“ stackName-dbcluster-ID.cluster-ID.us-west-2.rds.amazonaws.com”,但指向不同的IP地址。

发生了什么

我们遇到了错误1290“ SQLSTATE [HY000]:一般错误:1290 MySQL服务器正在使用--read-only选项运行,因此它无法执行此语句”。

随着数据库引擎停止启动,我们的初始持久连接将“消失”并失效(我们将在重新连接/重试代码中立即进行处理)。

但是,上面的错误表示将向旧节点建立新连接,但随后不会随着DNS更改的传播而进一步失效。它们持续了10/15分钟(远远超出了DNS的TTL)。

我的问题

  1. 有谁知道是否基于连接字符串检索了PDO上的持久连接,还是使用IP或其他签名更可靠?证据表明它是主机名,但需要确认。
  2. 有谁知道在PDO中将持久连接标记为“无效”的方法,因此不再使用它吗?
  3. 或者,有什么我想念的吗?

旁注

我们已经有适当的代码来处理重试,并且告诉他们重试以获得新的非持久连接(有效)。在这一点上,我们可以“无效” PDO连接,因此脚本的下一次运行不会一遍又一遍地重复此循环。

故障转移可以随时发生,因此我们无法执行手动操作,例如重新启动php(因为我们这次必须这样做)。

没有持久的连接,性能会明显降低。

FastCGI,Centos 16,PHP 7.2,MySQLD 5.0.12-dev(在Centos上是正常的-请参阅https://superuser.com/questions/1433346/php-shows-outdated-mysqlnd-version

php mysql pdo amazon-web-services amazon-aurora

11
推荐指数
1
解决办法
256
查看次数

选择距离为5km或更大的记录

我正在开发一个位置应用程序,我需要从我的Mysql Location表中获取所有位置,它们之间的距离为5km.

对于Ex位置表,有以下条目:

  id     Latitude       Longitude
  1     22.7499180     75.8950577
  2     22.7498474     75.8950653
  3     22.7498035     75.8950424
  4     22.7497787     75.8950729
  5     22.7498245     75.8950806
  6     22.7497902     75.8950272
  7     22.7497864     75.8950424
  8     22.7497768     75.8950500
  9     22.7497864     75.8950577
  10    22.7497921     75.8950653
  11    22.7497597     75.8950653
  12    22.7498283     75.8950653
  13    22.7497978     75.8950577
Run Code Online (Sandbox Code Playgroud)

所以从上面的表格我需要获取这样的结果

  id     Latitude       Longitude   Distance (>=5Km)
  1     22.7499180     75.8950577     --
  4     22.7497787     75.8950729    6km (From lat long of id 1)
  8     22.7497768     75.8950500    8km (From lat long of id 4)
  11    22.7497597     75.8950653    6km (From …
Run Code Online (Sandbox Code Playgroud)

mysql

10
推荐指数
1
解决办法
1101
查看次数

如何使用多个连接优化查询?

我有简单但很长的查询,它计算结果的内容大约需要14秒.主表上的计数本身不到一秒钟,但在多次加入后,延迟太高,如下所示

Select  Count(Distinct visits.id) As Count_id
    From  visits
    Left Join  clients_locations  ON visits.client_location_id = clients_locations.id
    Left Join  clients  ON clients_locations.client_id = clients.id
    Left Join  locations  ON clients_locations.location_id = locations.id
    Left Join  users  ON visits.user_id = users.id
    Left Join  potentialities  ON clients_locations.potentiality = potentialities.id
    Left Join  classes  ON clients_locations.class = classes.id
    Left Join  professions  ON clients.profession_id = professions.id
    Inner Join  specialties  ON clients.specialty_id = specialties.id
    Left Join  districts  ON locations.district_id = districts.id
    Left Join  provinces  ON districts.province_id = provinces.id
    Left Join …
Run Code Online (Sandbox Code Playgroud)

mysql database query-optimization

10
推荐指数
2
解决办法
1254
查看次数

mysql提供'无法初始化字符集utf-8(路径:/ usr/share/mysql/charsets /)'错误,那里没有utf8.xml文件

我正在学习更多关于mysqli和所有令人兴奋的东西的路径,但我很快就被阻止了.

我的debian盒子上有一个本地服务器.它是最新的,已安装php和mysql并顺利运行.我想在mysqli上学到更多东西,并尝试以下代码:

<?php

$db = new mysqli('localhost', 'userdb', 'pwuserdb', 'db');

if(!$db->set_charset('utf-8')) {
    printf("Error setting the character set utf-8: %s\n", $db->error);
} else {
    printf("Current character set is: %s\n", $db->character_set_name());
}

print_r($db->get_charset());

?>
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,在访问该页面时,我收到以下消息: Error setting the character set utf-8: Can't initialize character set utf-8 (path: /usr/share/mysql/charsets/) stdClass Object ( [charset] => latin1 [collation] => latin1_swedish_ci [dir] => [min_length] => 1 [max_length] => 1 [number] => 8 [state] => 801 [comment] => cp1252 West European )

我认为这是合乎逻辑的,因为我没有将utf-8设置为mysql的标准字符集,所以我在my.cnf文件中完成了以下设置:

对于 [mysqld]

default-character-set=utf8
Run Code Online (Sandbox Code Playgroud)

对于 …

php mysql mysqli utf-8 character-encoding

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