我正在执行一个相当大的 SQL,所以我很抱歉无法提供我的表的更大示例。
SELECT
customer_id,
agreement_id,
if( 'network' IN ( GROUP_CONCAT( DISTINCT services.service_code
SEPARATOR ',' ) ),
'Yes','No') as networkservice
FROM customers
INNER JOIN agreement USING(customer_id)
INNER JOIN services USING(agreement_id)
GROUP BY customer_id
一个客户可以有一个协议(protocol),一个协议(protocol)可以有很多服务。我想知道的是“网络”是否是该协议(protocol)中的服务之一。
因为 GROUP_CONCAT 返回一个逗号分隔的列表,所以它非常适合我的情况。但我无法让它发挥作用,而且我的想法已经用完了。
如果只有一项服务且该服务是“网络”,则返回"is",但如果有多个服务,则返回“否”。
如果我改用 (INT)service_id 则没有任何区别,除非我正在寻找的 INT 在列表中排在第一位。但这仅适用于 INT,如果“网络”在列表中排在第一位,则返回否。
我试过:
if( 'network' IN ( CAST(GROUP_CONCAT( DISTINCT services.service_code
SEPARATOR ' ' ) AS CHAR) ),
'Yes','No')
和
if( 'network' IN ( concat('\'',
GROUP_CONCAT(DISTINCT services.service_code
SEPARATOR '\', \'' ),
'\'') ), 'Yes','No')
如果我的解释听起来令人困惑,我可以提供更多示例。
谢谢。
最佳答案
我是 group_concat 的 super 粉丝,但在这种情况下您不需要group_concat
sum( if(services.service_code='network', 1, 0) ) as networkservice
关于MySQL IF IN GROUP_CONCAT 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7259023/
在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl
require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.
我下面有一个ruby脚本,它无限地打印从1开始的数字。如何通过终端中的中断(如“Ctrl+C”或键“q”)使脚本停止无限执行?a=0while(a)putsaa+=1#thecodeshouldquitifaninterruptofacharacterisgivenend在每次迭代中,不应询问用户输入。 最佳答案 使用Kernel.trap为Ctrl-C安装信号处理程序:#!/usr/bin/rubyexit_requested=falseKernel.trap("INT"){exit_requested=true}while!
有没有办法让ARel将列名写入(经过净化、可能别名等)CONCAT()和其他SQL函数?这是howtodoitwithAVG()...?>name=Arel::Attribute.new(Arel::Table.new(:countries),:name)=>#population=Arel::Attribute.new(Arel::Table.new(:countries),:population)=>#Country.select([name,population.average]).to_sql=>"SELECT`countries`.`name`,AVG(`countries`
我有一个User模型,它具有first_name和last_name属性。使用Arel我想使用CONCAT执行全名搜索。我已经阅读了HowdoIusefunctionslikeCONCAT(),etc.inARel?上的帖子这表明这是可能的,但我不能完全正确地使用语法。到目前为止我有classUser 最佳答案 对于最新的Arel,需要使用Arel::Nodes.build_quoted('')而不仅仅是String('')。所以现在的答案是:SEPARATOR=Arel::Nodes.build_quoted('')Arel::N
在Ruby中我有以下内容:#TrapInterruptstrap("INT")doputs"Shuttingdown..."exitend当我中断程序时,会打印以下内容(MacOSXLion):^CShuttingdown...有什么方法可以在Ruby中隐藏^C吗? 最佳答案 是否回显控制字符是您正在使用的tty的一个属性。stty-echoctl是禁用控制字符回显的Unix方法。如果您使用的是Unix-ish系统,您可以从Ruby脚本中运行此命令并获得相同的效果。 关于Ruby-在中断
为什么使用system调用创建的子进程中断ruby进程不会中断ruby进程本身?他们应该属于同一个组,所以应该都被打断。这也不适用于ruby2.0。给定ruby1.8.7补丁371、ruby1.9.3补丁392和ruby2.0补丁0:运行ruby1.8-e'system"sleep100";$?;bash中的sleep'并按⌃C只会终止对sleep100的内部调用。Ruby1.9的行为相同。虽然运行ruby2.0-e'system"sleep100";$?;sleep'中断内部命令和ruby进程本身。2.0.0-p0--编辑--阅读资源我发现处理SIGINT、S
我对Ruby的数组concat()与+操作进行了小型性能测试,concat()速度太快了。但是我不清楚为什么concat()这么快?有人可以帮忙吗?这是我使用的代码:t=Time.nowar=[]foriin1..10000ar=ar+[4,5]endputs"Timefor+"+(Time.now-t).to_st=Time.nowar=[]foriin1..10000ar.concat([4,5])endputs"Timeforconcat"+(Time.now-t).to_s 最佳答案 根据Rubydocs,不同之处在于:数组