我有一个查询,它从数据库中获取第二高日期的记录。我的查询运行良好,但执行起来花费了太多时间。我怎样才能快速执行我的查询。
最佳答案
我将采取与其他人有所不同的方式...我是否遗漏了一些东西,或者除了明显的索引优化之外,您的所有联接都在查找的主键上 - 您的标准准确吗?
这就是我的意思...您的最终 WHERE 子句..
WHERE
r.client_id IN ( SELECT opinion_id
FROM pacra_client_opinion_relations
WHERE client_id = 50 )
您要求 CLIENT_ID 在 OPINION_ID 的选择结果中,但只查找 client_ID = 50 的意见。Opinion_id 的上下文是什么。
表“pacra_client_opinion_relations”中客户与意见的澄清让我们看一下示例数据,如下所示
Opinion_ID Client_ID Other...
1 28 ...
2 35 ...
3 50 ...
4 2 ...
5 50 ...
6 6 ...
7 50 ...
8 4 ...
如果您的查询是 client_id = 50 的所有 OPINION_ID,您将返回 OPINION_ID #s 3、5 和 7。由于您的 where 子句在选择 Opinions 时要求 CLIENT_ID,您现在正在获取客户 3 的数据, 5 和 7,与您最初开始查看的客户 #50 无关。
此外...如果您只查找来自“Client_ID = 50”的内容,那么您之前的查询试图获取第二个到最近的通知日期,您正在查询所有客户。如果您为“Client_ID = 50”添加一个 where 子句,那么您将只会得到那些,而不是所有客户的第二次到最近的通知。
澄清 MAX() 小于内部 MAX()。来自评级的前数据你会得到以下......
og_ratings (assuming this data is pre-sorted per client for sample purposes)
client_id notification_date
13 Sep 5 <- You want THIS entry if it was client 13 included
13 Sep 14 <- Most recent for client 13
28 Sep 1
28 Sep 8
28 Sep 10 <- You want THIS entry if client 28 included
28 Sep 11 <- Most recent for client 28
29 Sep 4 <- You want THIS entry if client 29 included
29 Sep 11 <- Most recent for client 29
43 Sep 16 <- Most recent for client 43 and no prior,
this would never show as only one entry for client
50 Sep 2
50 Sep 9
50 Sep 12 <- You want THIS entry for client 50
50 Sep 15 <- Most recent for client 50
根据样本数据,您会得到...不同的客户可能有明显不同的第二个日期
client_id notification_date
13 Sep 5
28 Sep 10
29 Sep 4
50 Sep 12
如果您在 OUTERMOST 查询中只关心客户端 50,而您的实际数据有数百个客户端(甚至数千个客户端),那么您正在查询所有客户端。您可以通过...专门针对客户 50 限制您的内部查询。
og_ratings r INNER JOIN (
SELECT
client_id,
max(notification_date) notification_2nd_date
FROM
og_ratings
WHERE
(client_id, notification_date)
NOT IN ( SELECT client_id, max(notification_date)
FROM og_ratings
GROUP BY client_id )
GROUP BY
client_id
ORDER BY
client_id DESC
可以调整为...
og_ratings r INNER JOIN (
SELECT
client_id,
max(notification_date) notification_2nd_date
FROM
og_ratings
WHERE
client_id = 50 <--- ADDED TO WHERE CLAUSE for CLIENT 50 ONLY
AND (client_id, notification_date)
NOT IN ( SELECT client_id, max(notification_date)
FROM og_ratings
WHERE client_id = 50 <--- ADDED HERE TOO FOR CLIENT 50
GROUP BY client_id )
GROUP BY
client_id
ORDER BY
client_id DESC
它只会返回第 50 个客户的单条记录,而所有客户的日期都是如此
client_id notification_date
50 Sep 12
最后,在多次提供 MySQL 查询时,我都提供了使用关键字 STRAIGHT_JOIN 的方法。这基本上告诉 MySQL 按照您告诉它的顺序进行查询......有时(例如您的情况),您有一堆查找表,它可能会尝试为您考虑并首先使用查找表,因为它很低记录计数(或什么/如何)它应用查询。
SELECT STRAIGHT_JOIN ... 查询的其余部分
如果我的假设是准确的,还可以进行更简化的查询,我只是想解释我认为有问题的不同部分……最后,正如您所看到的示例数据,如果您可以准备关于现在和 future 的样本数据以及您想要获得的东西可能会有所帮助...
关于php - 为什么我的 mysql 查询运行缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32629305/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r