因此,我正在创建一个系统,该系统将一次从表中提取 50-150 条记录并将它们显示给用户,并且我试图为每条记录保留一个 View 计数。
我认为最有效的方法是创建一个 MEMORY 表,我使用 INSERT INTO 将行的 ID 拉入其中,然后有一个 cron 函数定期运行以聚合 View ID 计数并清除内存表,用最新的 View 计数更新原始表。这避免了不断更新可能最常访问的表,因此我不会在每个查询中一次锁定 150 行(如果我使用 MyISAM,则不会锁定整个表)。
基本上,方法解释了here .
但是,我当然希望在提取记录信息以供查看的同时执行此操作,并且我希望避免运行第二个单独的查询只是为了获取相同的计数数据集.
有没有办法选择一个数据集,返回该数据集,并同时将该数据集中的单个列插入到另一个表中?
看起来 PostgreSQL 可能有类似于我想要的带有 RETURNING 关键字的东西,但我使用的是 MySQL。
最佳答案
首先,我不会在 Main 表中添加计数器列。我将创建一个单独的 Audit 表,该表将保存 Main 表中项目的 ID 加上该 ID<> 被请求。本质上,Audit 表将存储请求的历史记录。在这种方法中,您可以轻松生成更有趣的报告。您始终可以计算每个项目的总计,也可以按天、周、月等计算每个项目或所有项目的摘要。根据数据量,您可以定期删除早于某个阈值(一个月、一年等)的审核条目。
此外,您可以根据需要轻松地将更多信息存储在 Audit 表中,例如,用户 ID 以计算每个用户的统计信息。
要“自动”填充Audit 表,我会创建一个存储过程。客户端代码将调用此存储过程而不是执行原始的 SELECT。存储过程将返回与原始 SELECT 完全相同的结果,但还会向客户端代码透明地向 Audit 表添加必要的详细信息。
因此,让我们假设 Audit 表如下所示:
CREATE TABLE AuditTable
(
ID int
IDENTITY -- SQL Server
SERIAL -- Postgres
AUTO_INCREMENT -- MySQL
NOT NULL,
ItemID int NOT NULL,
RequestDateTime datetime NOT NULL
)
你的主要 SELECT 看起来像这样:
SELECT ItemID, Col1, Col2, ...
FROM MainTable
WHERE <complex criteria>
要在 SQL Server 中的一条语句中同时执行 INSERT 和 SELECT,我会在 Postgres 中使用 OUTPUT 子句 - RETURNING 子句,在 MySQL 中 - ???我不认为它有这样的东西。因此,MySQL 过程将有几个单独的语句。
MySQL
首先执行您的SELECT 并将结果插入temporary (可能是内存)表。然后将项目 ID 从临时表复制到 Audit 表中。然后从临时表中SELECT返回结果给客户端。
CREATE TEMPORARY TABLE TempTable
(
ItemID int NOT NULL,
Col1 ...,
Col2 ...,
...
)
ENGINE = MEMORY
SELECT ItemID, Col1, Col2, ...
FROM MainTable
WHERE <complex criteria>
;
INSERT INTO AuditTable (ItemID, RequestDateTime)
SELECT ItemID, NOW()
FROM TempTable;
SELECT ItemID, Col1, Col2, ...
FROM TempTable
ORDER BY ...;
SQL Server(只是逗你玩。这个语句同时执行 INSERT 和 SELECT)
MERGE INTO AuditTable
USING
(
SELECT ItemID, Col1, Col2, ...
FROM MainTable
WHERE <complex criteria>
) AS Src
ON 1 = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT
(ItemID, RequestDateTime)
VALUES
(Src.ItemID, GETDATE())
OUTPUT
Src.ItemID, Src.Col1, Src.Col2, ...
;
您可以让Audit 表保持原样,或者您可以设置cron 来定期汇总它。这实际上取决于数据量。在我们的系统中,我们将单独的行存储一周,此外我们每小时汇总统计数据并将其保留 6 周,此外我们将每日汇总保留 18 个月。但是,重要的是,所有这些摘要都是单独的 Audit 表,我们不会在 Main 表中保留审计信息,因此我们不需要更新它。
Joe Celko 在 SQL Style Habits: Attack of the Skeuomorphs 中解释得很好:
Now go to any SQL Forum text search the postings. You will find thousands of postings with DDL that include columns named
createdby,createddate,modifiedbyandmodifieddatewith that particular meta data on the end of the row declaration. It is the old mag tape header label written in a new language! Deja Vu!The header records appeared only once on a tape. But these meta data values appear over and over on every row in the table. One of the main reasons for using databases (not just SQL) was to remove redundancy from the data; this just adds more redundancy. But now think about what happens to the audit trail when a row is deleted? What happens to the audit trail when a row is updated? The trail is destroyed. The audit data should be separated from the schema. Would you put the log file on the same disk drive as the database? Would an accountant let the same person approve and receive a payment?
关于php - SQL INSERT INTO SELECT 并返回 SELECT 数据以创建行 View 计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32281469/
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"