我发现了几个与该任务相关的线程,但都没有真正帮助我,或者我没有足够的经验来理解它。
我正在使用 mysql 并有两个表 user 和 user_rh。我想要一个用户名列表(按名称排序),其中包含 user_rh 中相应的条目数。
`user` `user_rh`
------------------ ------------------
| `uid` | `name` | | `uid` | `zaid` |
------------------ ------------------
| 1 | Bob | | 2 | 4 |
| 2 | John | | 2 | 7 |
| 3 | Fred | | 3 | 2 |
| 4 | Peter | ------------------
------------------
所以结果应该是这样的:
--------------------
| `name` | `count` |
--------------------
| Bob | 0 |
| Fred | 1 |
| John | 2 |
| Peter | 0 |
--------------------
我试过这个查询:
SELECT
`user`.`name`,
`user_rh`.`uid`
FROM
`user`
LEFT JOIN
`user_rh`
ON (`user_rh`.`uid`=`user`.`uid`)
ORDER BY
`user`.`name`
它以正确的方式进行,但这不会返回计数值:
------------------
| `name` | `uid` |
------------------
| Bob | NULL |
| John | 2 |
| John | 2 |
| Fred | 1 |
| Peter | NULL |
------------------
我以为我只是添加了 COUNT() 和 GROUP BY 命令:
SELECT
`user`.`name`,
COUNT(`user_rh`.`uid`) AS `count`
FROM
`user`
LEFT JOIN
`user_rh`
ON (`user_rh`.`uid`=`user`.`uid`)
GROUP BY
`user_rh`.`uid`
ORDER BY
`user`.`name`
但它向我展示了这样的东西。首先,它提供一个已排序的名称列表,其中包含 count!=0,列表的最后一个条目是表 user 的第一个条目,其中包含 count=0。
------------------
| `name` | `uid` |
------------------
| John | 2 |
| Fred | 1 |
| Bob | 0 |
------------------
我想,我只是以错误的方式组合了命令。
最佳答案
您的第二个查询没问题。只需按第一个表中的用户分组。否则你会将你的left join变成inner join
SELECT
u.name,
COUNT(rh.uid) AS cnt
FROM
`user` u
LEFT JOIN
user_rh rh
ON (rh.uid = u.uid)
GROUP BY
u.uid, u.name
ORDER BY
u.name
关于MYSQL LEFT JOIN 和 COUNT 和 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27985863/
TLDR:App.count需要重新加载才能看到创建的记录。为什么?我找到了很多关于测试DELETE方法的引用资料,如下所示:expect{delete_request}.tochange(App,:count).by(-1)这是有道理的,并且适用于一些类似的场景。但是,我在测试不应该执行的删除时遇到了一个问题,例如当没有用户登录时。我从这里开始,用两种方法来测试同一件事:require'rails_helper'RSpec.describeV1::AppsController,type::controllerdolet(:user){create(:user)}let(:app){c
我想显示一个计数中使用的SQL。但是,Model.count.to_sql将不起作用,因为count返回一个没有to_sql方法的FixNum。我认为最简单的解决方案是这样做:Model.where(nil).to_sql.sub(/SELECT.*FROM/,"SELECTCOUNT(*)FROM")这会创建与Model.count中使用的SQL相同的SQL,但它是否会导致进一步的问题?例如,如果我添加一个复杂的where子句和一些连接。有更好的方法吗? 最佳答案 你可以试试Model.select("count(*)asmode
对于最近的一个项目,我有几个View是这样的代码:这在开发模式下工作得很好......我将它推出到生产模式并且它爆炸了,说count不是Array的有效方法。我将每个实例都改为使用Array#length,它似乎可以正常工作。1)这种行为差异的原因是什么?2)我应该注意开发模式和生产模式之间的任何其他令人兴奋的差异吗?道德:确保您的生产托管环境使用与本地开发环境相同的Ruby版本。:)谢谢汤姆 最佳答案 count方法仅在Ruby1.9及更高版本中可用。我建议您使用与服务器相同版本的Ruby以避免此类问题-1.9中发生了很多变化
当我向will_paginate传递一个ActiveRelation时,它总是调用它的#count方法并访问数据库以找出项目的总数。但是这个操作需要时间,而且我已经缓存并准备好了总数。我可以将这个预先计算的计数传递给will_paginate并阻止它访问数据库吗?我尝试了:count选项,但它作为选项传递给了ActiveRecord:active_relation.paginate(page:2,per_page:100,count:total_count)谢谢!:) 最佳答案 通过:total_entries传递缓存计数解决了问题
忙于学习Ruby...文档有一个例子:"helloworld".count("lo","o")返回2那如何返回2?在我的示例中,我已经:puts"Lennie".count("Le","ie")返回2。计数在这方面是如何工作的? 最佳答案 "helloworld".count("lo")返回5。它匹配了第三个、第四个、第五个、第八个和第十个字符。让我们称之为第一组。"helloworld".count("o")返回二。它匹配了第五个和第八个字符。让我们将此称为第二组。"helloworld".count("lo","o")计算集合一
我有这个代码:0%>#@statesisanactiverecordcollection我只是觉得应该有更好的方式来写这个。我正在寻找类似的东西:我意识到这是一个微小的变化,但它会是一个受欢迎的清理。 最佳答案 您可能需要ActiveRecord的any?http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-any-3FDostuffhereif@stateshasatleastoneresult 关
在Ruby1.9(YARV)中,您可以获得所有当前已分配对象的计数,如下所示:ObjectSpace.count_objects它返回一个像这样的散列{:TOTAL=>1226560,:FREE=>244204,:T_OBJECT=>26141,:T_CLASS=>9819,:T_MODULE=>1420,:T_FLOAT=>287,:T_STRING=>260476,:T_REGEXP=>4081,:T_ARRAY=>72269,:T_HASH=>14923,:T_STRUCT=>4601,:T_BIGNUM=>7,:T_FILE=>16,:T_DATA=>54553,:T_MATC
我有一个散列,我想将其中的值用作新散列中的键,该新散列包含该项目在原始散列中作为值出现的次数的计数。所以我使用:hashA.keys.eachdo|i|putshashA[i]end示例输出:0112011我希望新的哈希如下:{0=>2,1=>4,2=>1} 最佳答案 counts=hashA.values.inject(Hash.new(0))do|collection,value|collection[value]+=1collectionend 关于Ruby"count"哈希方法,
我有一个应用程序,我可以在其中列出项目并为每个项目添加标签。模型Items和Tags是这样关联的:classItem:taggingsendclassTagging:taggingsend因此,这种多对多关系允许我为每个Item设置n标签,并且同一个标签可以多次使用。我想列出所有标签,这些标签按与该标签关联的项目数排序。更多使用的标签,首先显示。较少使用,最后。我该怎么做?问候。 最佳答案 Tag.joins(:taggings).select('tags.*,count(tag_id)as"tag_count"').group(:
@card.submissions返回:]>@card.submissions.any?返回true。@card.submissions.count返回0。我要实现的是:if@card.submissions.any?render@card.submissionsend 最佳答案 看起来Submission是一个新记录(因为id是nil)。如果它是新的,它还没有进入数据库。count对数据库进行SQL调用以确定行数,因此正确地返回零。any?返回true,因为集合中有一个对象。如果您尝试@card.submissions.to_a.