相关疑难解决方法(0)

我的子查询为执行时间增加了20秒.我怎样才能加快速度?

我有一个已发送短信的表格,该短信必须加入到送达回执表中才能获得最新的短信状态.

有997,148条发送短信.

我正在运行此查询:

SELECT
    m.id,
    m.user_id,
    m.api_key,
    m.to,
    m.message,
    m.sender_id,
    m.route,
    m.submission_reference,
    m.unique_submission_reference,
    m.reason_code,
    m.timestamp,
    d.id AS dlrid,
    d.dlr_status
FROM
    messages_sent m
LEFT JOIN
    delivery_receipts d
ON
    d.message_id = m.id
AND
    d.id = (SELECT MAX(id) FROM delivery_receipts WHERE message_id = m.id)
Run Code Online (Sandbox Code Playgroud)

返回997,148个结果,包括每条消息的最新状态.

这需要22.8688秒来执行.

这是SQL messages_sent:

CREATE TABLE IF NOT EXISTS `messages_sent` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`api_key` varchar(40) NOT NULL,
`to` varchar(15) NOT NULL,
`message` text NOT NULL,
`type` enum('sms','mms') NOT NULL …
Run Code Online (Sandbox Code Playgroud)

php mysql sql database phpmyadmin

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

获取每组的前/后n条记录

我有两个表:tableA (idA, titleA)tableB (idB, idA, textB)有一个在它们之间一对多的关系.对于tableA中的每一行,我想检索tableB中对应的最后5行(由idB排序).

我试过了

SELECT * FROM tableA INNER JOIN tableB ON tableA.idA = tableB.idA LIMIT 5
Run Code Online (Sandbox Code Playgroud)

但它只是限制了INNER JOIN的全局结果,而我想限制每个不同tableA.id的结果

我怎样才能做到这一点 ?

谢谢

mysql sql inner-join greatest-n-per-group

7
推荐指数
2
解决办法
5358
查看次数

如何为每个成员选择最新的输入?

假设我有一个MySQL表:

??????????????????????????????????
? time ? mid ? field_1 ? field_2 ?
??????????????????????????????????
?  100 ?   1 ?      32 ?      54 ?
?  100 ?   2 ?       0 ?      34 ?
?  100 ?   3 ?      44 ?      99 ?
?  200 ?   1 ?       0 ?      45 ?
?  200 ?   2 ?       0 ?      45 ?
?  200 ?   3 ?       4 ?      59 ?
?  200 ?   4 ?      45 ?      45 ?
??????????????????????????????????

time是UNIX时间戳.mid是会员ID.field_1由会员提供.field_2自动填充.

我希望为所有成员选择具有最近非零field_1的行.因此查询将导致:

??????????????????????????????????
? …

mysql

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

通过"SELECT"命令选择每组的前两个记录的最佳方法是什么?

例如,我有下表:

id group data
1 1 aaa
2 1 aaa
3 2 aaa
4 2 aaa
5 2 aaa
6 3 aaa
7 3 aaa
8 3 aaa
Run Code Online (Sandbox Code Playgroud)

通过"SELECT"命令选择每组的前两个记录的最佳方法是什么?如果没有好办法,你建议做什么例程?(在PHP中)

(模型结果)

1 1 aaa
2 1 aaa
3 2 aaa
4 2 aaa
6 3 aaa
7 3 aaa
Run Code Online (Sandbox Code Playgroud)

我知道在子查询中通过a.id> = b.id进行交叉连接可以正常工作,但我正在寻找一种可扩展的解决方案,可以应用于具有数百万条记录的表.谢谢

php mysql sql group-by greatest-n-per-group

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

MySQL:ORDER BY FIELD/GROUP BY

我的问题是关于MySQL优化和良好实践.

我必须得到带有订单偏好的翻译文本列表:如果我找不到英文文本,我想使用法文文本,如果它不存在,我想用西班牙语.

换句话说,我有:

id  lang text
1   fr   text_FR
1   en   text_EN
1   es   text_ES
2   fr   text_FR2
3   fr   text_FR3
3   es   text_ES3
Run Code Online (Sandbox Code Playgroud)

而且我要:

id  lang text
1   en   text_EN
2   fr   text_FR2
3   fr   text_FR3
Run Code Online (Sandbox Code Playgroud)

所以我读了一些像这样,这个,那个那个的主题.好.我试过这个:

SELECT text FROM (
    SELECT id, text 
    FROM translation 
    ORDER BY FIELD(lang, 'en', 'fr', 'es')
) tt GROUP BY tt.id;
Run Code Online (Sandbox Code Playgroud)

但是,当我解释这个查询时,我可以读到:

id  select_type table   partitions  type    possible_keys   key key_len ref rows    Extra
1   PRIMARY …
Run Code Online (Sandbox Code Playgroud)

mysql optimization

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

性能:两个查询之间有什么区别

我原本写了以下内容

SELECT t1.TransactionNumber
FROM t1
    JOIN
    (
          SELECT MAX(id) id
          FROM t1
          WHERE Period BETWEEN '01-11-2013' and '01-12-2014'
          GROUP BY AccountNumber
    ) t2
        on t1.id= t2.id
Run Code Online (Sandbox Code Playgroud)

但它太慢了.花了大约20秒,所以作为测试,我将其更改为以下内容

 SELECT MAX(id) AS id
 INTO #t2
 FROM t1
 WHERE Period BETWEEN '01-11-2013' and '01-12-2014'
 GROUP BY AccountNumber

 SELECT t1.id 
 FROM t1
    JOIN #t2 t2
        ON t1.id= t2.id
Run Code Online (Sandbox Code Playgroud)

第二个查询仅运行1秒.第二个查询使用PK密钥执行索引查找,而第一个键执行扫描.

注意:id是聚集在t1表上的主键.

sql sql-server-2008

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

具有多个连接可能性的连接的MySQL更新

概念上的疑问:

我已经尝试了很多事情(MySQL),但是此更新起作用的唯一方法是我在此处描述的方法。它正在工作,但是我要确保这一点:

当我们在更新中使用join时,我将要设置的值来自被连接的表,并且每一行有多个连接可能性,更新是否总是获得进行连接的第一行?

create table letter (id_letter bigint, id_group_table bigint, letter char(1));  
create table group_table (id_group_table bigint, id_whatever bigint, champion char(1));
create table whatever (id_whatever bigint);

insert into whatever values (1);
insert into whatever values (2);
insert into whatever values (3);
insert into whatever values (4);
insert into whatever values (5);

insert into group_table values(1, 1, null); -- champion should be B
insert into group_table values(2, 2, null); …
Run Code Online (Sandbox Code Playgroud)

mysql sql join sql-update

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

ActiveRecord 返回每个用户的最新记录(唯一)

我有一个用户模型和一个卡模型。用户有很多卡,所以卡有一个属性user_id

我想为每个用户获取最新的单张卡。我已经能够做到这一点:

Card.all.order(:user_id, :created_at)
# => gives me all the Cards, sorted by user_id then by created_at
Run Code Online (Sandbox Code Playgroud)

这让我成功了一半,我当然可以迭代这些行并获取每个用户的第一个行。但这对我来说真的很糟糕,因为我会使用 Ruby 中的数组来做很多这样的事情。

我也可以这样做:

Card.select('user_id, max(created_at)').group('user_id')
# => gives me user_id and created_at
Run Code Online (Sandbox Code Playgroud)

...但我只取回 user_ids 和created_at 时间戳。我无法选择任何其他列(包括 id),因此我返回的内容毫无价值。我也不明白为什么 PG 不允许我选择比上面更多的列而不将它们放入 group_by 或聚合函数中。

我更愿意找到一种仅使用 ActiveRecord 来获取我想要的内容的方法。我也愿意用原始 SQL 编写此查询,但前提是我无法使用 AR 完成它。顺便说一句,我使用的是 Postgres DB,这限制了我的一些选择。

多谢你们。

ruby postgresql activerecord ruby-on-rails ruby-on-rails-4

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

基于另一列的最大值的列上的SQL内连接

我有两个表,一个"主"是主列表的名称,第二个"方案"是主列表中每个名称的多个方案的列表.我希望我的INNER JOIN查询从"scenario"表中获取具有列状态的ID的主列表,但仅获取基于scenarioID的最新状态.这是我尝试的代码和具有所需输出的表

SELECT DISTINCT a.[user], a.ID, a.Name, b.status
from master a
INNER JOIN scenario b ON a.ID = b.ID
WHERE
    b.scenarioID = (
           SELECT max(scenarioID) FROM scenario c2 WHERE c2.ID=c.ID)
Run Code Online (Sandbox Code Playgroud)

ID    user    Name
425   John    Skyline
426   John    Violin
427   Joe     Pura
Run Code Online (Sandbox Code Playgroud)

脚本

ID    ScenarioID    status
425   1             active
425   2             active
425   3             done
426   1             active
426   2             active
427   1             done
Run Code Online (Sandbox Code Playgroud)

期望的输出

ID    user    Name    status
425   John    Skyline done
426   John    Violin  active …
Run Code Online (Sandbox Code Playgroud)

sql sql-server inner-join max where

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

MySQL - 如何选择字段最大值的行

我有一个用户表格,其中包含游戏每个级别的分数:

id | user_id | level | score
1  | David   | 1     | 20
2  | John    | 1     | 40
3  | John    | 2     | 30
4  | Mark    | 1     | 60
5  | David   | 2     | 10
6  | David   | 3     | 80
7  | Mark    | 2     | 20
8  | John    | 3     | 70
9  | David   | 4     | 50
10 | John    | 4     | 30
Run Code Online (Sandbox Code Playgroud)

每个级别需要获取的 SQL …

mysql sql

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