我有一个已发送短信的表格,该短信必须加入到送达回执表中才能获得最新的短信状态.
有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) 我有两个表: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表:
?????????????????????????????????? ? 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的行.因此查询将导致:
?????????????????????????????????? ? …
例如,我有下表:
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进行交叉连接可以正常工作,但我正在寻找一种可扩展的解决方案,可以应用于具有数百万条记录的表.谢谢
我的问题是关于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) 我原本写了以下内容
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表上的主键.
概念上的疑问:
我已经尝试了很多事情(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) 我有一个用户模型和一个卡模型。用户有很多卡,所以卡有一个属性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,这限制了我的一些选择。
多谢你们。
我有两个表,一个"主"是主列表的名称,第二个"方案"是主列表中每个名称的多个方案的列表.我希望我的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) 我有一个用户表格,其中包含游戏每个级别的分数:
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 ×7
sql ×7
inner-join ×2
php ×2
activerecord ×1
database ×1
group-by ×1
join ×1
max ×1
optimization ×1
phpmyadmin ×1
postgresql ×1
ruby ×1
sql-server ×1
sql-update ×1
where ×1