- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
背景:
首先,我有一个包含名为 patients
的表的模式,我在其中关注 patient_id
和 alerts
(alerts 是一串字符,其中每个字符代表一些任意值/含义)。其次,每个“患者”都是仅基于其 patient_id 前 6 位数字的组 [家庭] 的一部分。此外,还有一些第三方依赖此数据库; 我没有设计,也无法更改此架构/数据模型,我无法从 MySQL 迁移出去。
Here is a fiddle with the data model
挑战:
现在,我需要找到患者发出包含 !
、@
、#
、%
的警报的事件、^
或 &
符号及其家族成员不存在。我的第一个想法是收集所有具有包含这些符号的警报的患者,删除每个 patient_id 中的最后一位数字,然后按此值分组。现在我有一个(出于所有意图和目的)“group_ids”的列表。最后,我需要扩展列表以包含每个组的家庭成员及其各自的警报字符串。
这是我目前所拥有的:
查询#1:
SELECT p.patient_id, p.name_first, p.name_last, p.alerts
FROM patients p
INNER JOIN (SELECT SUBSTRING(patient_id, 1, CHAR_LENGTH(patient_id) - 1) AS group_id
FROM patients
WHERE patient_id BETWEEN 1000000 AND 7999999
AND (alerts like '%!%'
OR alerts like '%@%'
OR alerts like '%#%'
OR alerts like '%\%%'
OR alerts like '%^%'
OR alerts like '%&%')
GROUP BY group_id) g
ON p.patient_id LIKE CONCAT(g.group_id, '%')
ORDER BY p.patient_id
LIMIT 30000;
Fiddle ~ 注意:fiddle 不是问题的准确表示,因为包含的表只有 28 条记录。
Recordset: 80,000 ~ Results: 2188 ~ Duration: 14.321 sec ~ Fetch: 0.00 sec ~ Total: 14.321 sec
查询#2:
SELECT p.patient_id, p.name_first, p.name_last, p.alerts
FROM patients p
JOIN (SELECT DISTINCT LEFT(patient_id, 6) AS group_id
FROM patients
WHERE patient_id BETWEEN 1000000 AND 7999999
AND alerts REGEXP '[!@#%^&]') g
ON p.patient_id LIKE CONCAT(g.group_id, '%')
ORDER BY p.patient_id
LIMIT 30000;
Fiddle ~ 注意:fiddle 不是问题的准确表示,因为包含的表只有 28 条记录。
Recordset: 80,000 ~ Results: 2188 ~ Duration: 4.259 sec ~ Fetch: 5.663 sec ~ Total: 9.992 sec
编辑:在添加 name_first、name_last、alerts 和 order by 子句后,我发现这个查询花费的时间与第一个完全相同。
问题:
我返回的列表是准确的,但是,它不仅需要额外的处理(我打算用 PHP 来完成),而且还需要 14 秒!
如果有人有更好的……或者至少可以指出更好、更有效的解决方案的方向,请赐教。提前致谢。
额外学分:关于 PHP 算法的任何提示,以解决上述给定数据的问题 - 忘记语义,只需一个公式即可。
最佳答案
我找到了一个足够有效的解决方案如下:
SELECT p.patient_id, name_first, name_last, alerts
FROM patients p
JOIN (SELECT DISTINCT LEFT(patient_id, 6) AS group_id
FROM patients
WHERE patient_id BETWEEN 1000000 AND 7999999
AND alerts REGEXP '[!@#%^&]') g
ON LEFT(p.patient_id, 6) = g.group_id /* HERE is the simple magic */
ORDER BY p.patient_id
LIMIT 30000;
记录集:80,000 ~ 结果:2188 ~ 持续时间:0.312 秒 ~ 提取:0.062 秒 ~ 总计:0.374 秒
因为我们知道合法的 patient_ids 是 7 位数字长,我们可以通过简单地使用 LEFT(patient_id, 6)
而不是效率较低的 SUBSTRING(patient_id, 1, CHAR_LENGTH(patient_id) - 1)
(我现在看到我最初可以写成 SUBSTRING(patient_id, 1, 6)
)。无论此处使用何种方法,真正节省的是对 ON
子句的更改。与其将 patient_id 与 LIKE CONCAT(group_id, '%')
进行比较,为什么不直接将 =
与表 'p' 中 patient_id 的左 6 位数字进行比较?
换句话说,嵌套选择用于查找所有唯一的“组”,其中至少一个成员具有所需警报符号之一。主选择使用此表来确定属于这些组的所有患者。本质上,LEFT(patient_id, 6) == 'group_id'
并且我们可以保留我们的索引...唯一的额外开销是每行调用一次 LEFT()。
"KISS." 的另一个例子
感谢大家的帮助!
编辑:因为我将在我的 PHP 算法中使用 group_id,所以我将以高效的方式将其添加到选择中:
SELECT g.group_id, RIGHT(p.patient_id, 1) AS sub_id, name_first, name_last, alerts
FROM patients p
JOIN (SELECT DISTINCT LEFT(patient_id, 6) AS group_id
FROM patients
WHERE patient_id BETWEEN 1000000 AND 7999999
AND alerts REGEXP '[!@#%^&]') g
ON LEFT(p.patient_id, 6) = g.group_id
ORDER BY p.patient_id
LIMIT 30000;
HERE is a fiddle! ~ 注意:这不是解决方案的准确表示,因为包含的表只有 28 条记录。在更大的数据集上查看以上结果。
最后,我用来完成处理的 PHP 算法 ~ shoutout @The Nail :
$cur_group_id = 0;
$members = [];
$symbol = '';
$errs = false;
while($row = $result->fetch_assoc()){
$row['alerts'] = preg_replace('/[^!@#%^&]+/i', '', $row['alerts']);
if($row['group_id'] != $cur_group_id){
if($errs){
foreach($members as $member => $data){
printf('<tr><td>%d%d</td><td>%s</td><td>%s</td><td>%s</td></tr>',
$data['group_id'],
$data['sub_id'],
$data['name_last'],
$data['name_first'],
$data['alerts']);
}
}
/* reset current group */
$cur_group_id = $row['group_id'];
$members = array();
$symbol = $row['alerts'];
$errs = false;
}
$members[] = $row;
if($row['alerts'] != $symbol || strlen($row['alerts']) > 1){
$errs = true;
}
}
总处理时间(包括查询):0.6 秒!!
关于mysql - 连接表 a 到表 b 在匹配子字符串上的效率低下......想法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46229856/
所以这个有点难以解释,但我会尝试一下: 我有一个带有 .boxes 类的 div。它是一些循环元素的包装。循环元素具有类.box。在这个元素中,还有两个元素。一种是 .box-header 类的 he
我有一个网站,我试图在调整浏览器窗口大小时使其表现得体。例如,我希望在有人缩小浏览器窗口时调整横幅图像的大小。网址是http://www.pfp-consortium.org 顶部的横幅在 CSS 中
我想知道情况,是将所有可能的元素都放在表单中更好,还是在用户需要时立即将元素添加到表单中更好。 我将尝试对其进行更多解释 - 我的表单具有 4 个输入和一个文本区域。然后我提供了可选值(大约 15 -
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
所以我一直在研究我正在构建的一个论坛,并且一直专注于它的一个方面,即如何在不在数据库中存储大量数据的情况下跟踪未读的帖子和通知。在查看了一些解决方案之后,我相信我想出了一个可能适合我需要的解决方案,但
编写一个高质量的软件应该是第一步。现在这是一个移动的目标。(我们有一些类似于 https://stackoverflow.com/questions/3716203/automatic-code-qu
我有一组存储在数组中的二维点。 我需要尽可能多地压缩它。最好是快速,但不要破坏交易,压缩率是目标。规则是: 一个点=一个32位的结构,存储为(x,y),每个坐标2个字节 坐标 = 8 位整数部分和 8
我的一个应用程序从服务器下载数据库。当我将应用程序安装到我的手机上时,它会正确下载文件并加载信息,没有抛出任何异常或任何东西。 但是,当我将 apk 上传到 Android Market Place
我们最近接到一位客户的电话,提示他们网站的页面底部有一些“看起来很奇怪的代码”。我们查看了源代码,发现 templates/master 中附加了大约 800 字节的恶意 javascript 代码。
以编程方式创建系统还原点是“禁忌”吗?我会在执行软件更新之前执行此操作。如果有更好的方法可以仅使用我的软件文件和数据创建还原点,请告诉我。 我想要一种方法,如果在更新期间一切都发生了故障(关闭/终止更
我有一个有很多相关模型的类问题。在我的应用程序的一个页面上,我列出了所有当前问题的摘要,以及来自相关记录的各种信息。最终,这是一个值的散列,然后我将其打印到一个 csv 样式的行中(从这里我将其称为“
我目前正在尝试从 NSClassFromString(NSString *) 方法创建对象。 我希望能够实现的是以下... NSClassFromString(stringType) *pageCon
使用 Intellij 想法,我如何找出使变量可见的原因? 困难时的示例: 假设你看 class A ,你会看到一个变量 something .如果你跳转到源代码,你会看到它是在 trait X 中定
在IntelliJ IDEA的代码样式设置中,没有.gradle文件的任何子类别(例如build.gradle),在“其他文件类型”下,没有任何选项可以修改花括号位置。我没有找到为.gradle文件设
我正在尝试按照here指令运行docker-compose,但它似乎陷入了循环。在安装Docker之前,我能够调出示例站点并进行一些外观上的更改,但是尝试使用docker-compose生成缩略图23
我正在使用 IntelliJ IDEA 12.1.4 来调试 Grails 应用程序。我开始调试 session 大约需要 2 分钟。我想尽可能避免重新启动。 我正在尝试调试一个 Controller
随着 .NET 4.0 的出现,MS AJAX 是否仍占有一席之地,或者您认为 JQuery 是否会扩展以包含 AJAX 的全部功能,并使我们所知的 MS AJAX 变得多余? 最佳答案 请记住,AS
需要帮助运行此示例 Google+ API Quickstart w/C# 应用程序,请使用 VS2015 并按照此处的说明操作:https://developers.google.com/+/web
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我有一个相当“疯狂”的想法,即在我的应用程序中拥有一个“存储过程”设施。基本上,我的应用程序以数据为中心,它可以通过某种形式的 Restful 界面访问数据存储。 我希望拥有以多种方式操作数据(这是一
我是一名优秀的程序员,十分优秀!