使用我未创建的数据库结构并希望在简单的 MySQL 查询上获得一些帮助。我有一个投票表 votes,其中包含以下字段:
vote_id = 唯一投票标识符
item_id = 投票条目的 id
voter_id = 参与投票的成员(member)id
vote_date = 投票日期
vote = 投票类型(1 或 2)
每个用户可以对 item_id 指定的站点条目进行多次投票。他们可以投 1 票即“喜欢”票,或投 2 票即“反对”票。每次他们投票时,都会创建一个新记录。我希望能够找到每个用户在特定 item_id 上的最新 vote 值,然后能够实际对投票列求和或计算投票值是一个“喜欢”(值为1)
例如
vote_id item_id voter_id vote_date vote
60 9 27 1273770151 1
153 9 45 1274896188 1
163 9 3 1274918584 1
164 9 3 1275021495 2
1051 9 181 1290839090 1
我想为每个用户获取最新的 vote 值,然后计算有多少票为 1。在这种情况下,# 将是 3
27 = 1
45 = 1
3 = 2
181 = 1
3
理想情况下,一旦我为每个 item_id 获得“分数”,查询就能够将每个分数的总和计算为站点上所有当前“喜欢”的总数。
感谢您对此的任何帮助。我尽我所能通过搜索找到了这个问题的答案,但没有什么是完全正确的。
非常感谢。
最佳答案
[编辑:] 我添加了值 (1052, 10, 3, 1290839091, 1) 以更好地解决问题,并且必须将“item_id”添加到提取最新 选票的子查询.
耶!我终于可以回答一个 stackoverflow 问题了!!!我已经浏览了一个星期,寻找一些简短而甜蜜的东西。感谢您提出一个有趣的 SQL 问题!
首先,您需要提取最新 票。 (voter_id, item_id, vote_date) 的组合最好是独一无二的,这样才能发挥作用!
SELECT
voter_id, item_id, MAX(vote_date) AS vote_date
FROM
votes
GROUP BY
voter_id, item_id
结果:
+----------+---------+------------+
| voter_id | item_id | vote_date |
+----------+---------+------------+
| 3 | 9 | 1275021495 |
| 3 | 10 | 1290839091 |
| 27 | 9 | 1273770151 |
| 45 | 9 | 1274896188 |
| 181 | 9 | 1290839090 |
+----------+---------+------------+
然后您需要根据这些结果连接原始表。子选择将完成这项工作。请注意上面的查询是如何复制并粘贴到下面的连接中的,但现在它被命名为“tmp”:
SELECT
v.*
FROM (
SELECT
voter_id, item_id, MAX(vote_date) AS vote_date
FROM
votes
GROUP BY
voter_id, item_id
) tmp
INNER JOIN
votes v ON ( v.vote_date = tmp.vote_date
AND v.voter_id = tmp.voter_id
AND v.item_id = tmp.item_id
)
结果:
+---------+---------+----------+------------+------+
| vote_id | item_id | voter_id | vote_date | vote |
+---------+---------+----------+------------+------+
| 60 | 9 | 27 | 1273770151 | 1 |
| 153 | 9 | 45 | 1274896188 | 1 |
| 164 | 9 | 3 | 1275021495 | 2 |
| 1051 | 9 | 181 | 1290839090 | 1 |
| 1052 | 10 | 3 | 1290839091 | 1 |
+---------+---------+----------+------------+------+
我相信你知道从这里该怎么做......哦该死的,我情不自禁,这太可爱了:
SELECT
v.item_id, SUM(2 - v.vote) AS likes, SUM(v.vote - 1) AS dislikes
FROM (
SELECT
voter_id, item_id, MAX(vote_date) AS vote_date
FROM
votes
GROUP BY
voter_id, item_id
) tmp
INNER JOIN
votes v ON ( v.vote_date = tmp.vote_date
AND v.voter_id = tmp.voter_id
AND v.item_id = tmp.item_id
)
GROUP BY
v.item_id
结果:
+---------+-------+----------+
| item_id | likes | dislikes |
+---------+-------+----------+
| 9 | 3 | 1 |
| 10 | 1 | 0 |
+---------+-------+----------+
关于MySQL 投票表,查找每个用户对条目的最新投票,并根据值进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5098885/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s