【问题标题】:Count number of rows where Extract Value found a match计算提取值找到匹配项的行数
【发布时间】:2014-08-18 14:20:55
【问题描述】:

一个表中有 100,000 行,其中包含一个存储大型 XML 块的列,我需要检查该列中是否有某个 XML 标记填充了数据,假设该列称为 test_request 并且 XML 标记是命名为“d”。此外,我想确保 'd' 中的值在 XML 标记中不包含换行符 /n。因此,对于有匹配项的每一行,我想在总计数中加 1。到目前为止,这是我的查询。

SELECT EXTRACTVALUE( UNCOMPRESS(`test__request` ) ,  count('/a/b/c/d') ) 
FROM testTable16
WHERE  `test_created` >  '2014-08-16 10:00:00'
AND  `test_created` <=  '2014-08-16 10:10:00'
AND  `test_client` =  'test2'
AND  `test_user` =  'testuser2'
AND UNCOMPRESS(  `test__request` ) LIKE  '%<testID>test</testID>%'
LIMIT 0 , 30

它不起作用,因为它返回 100,000 行,我显然无法筛选。而且我不确定如何进行 isnt 换行检查。

【问题讨论】:

  • 这是mysql还是sql?
  • mysql,抱歉,stackoverflow 告诉我将 SQL 添加为标签是个好主意。
  • 作为一个好的经验法则,让您的标签尽可能具体。mysql 不支持 sql 所做的一切,因此需要澄清 :)
  • 您的 extractvalue() 选择会产生什么?我们可以看到一些数据吗? :)
  • 返回的是前 30 行包含 0(其余的可能包含 0 或 1,关键是我无法搜索所有行太多,这就是为什么我需要总共匹配项)

标签: mysql xml xpath extract-value


【解决方案1】:

如果您只返回带有计数的行,则应将计数移至WHERE 子句。

我的 XPATH 有点生疏了,但我相信你可以使用带有 contains 函数的谓词:

SELECT *
FROM testTable16
WHERE  `test_created` >  '2014-08-16 10:00:00'
AND  `test_created` <=  '2014-08-16 10:10:00'
AND  `test_client` =  'test2'
AND  `test_user` =  'testuser2'
AND UNCOMPRESS(`test__request`) LIKE  '%<testID>test</testID>%'
AND EXTRACTVALUE( 
      UNCOMPRESS(`test__request`),  
      'count(/a/b/c/d[contains(text(),"\n")])'
    ) > 0
LIMIT 0 , 30

如果您想返回至少有一个匹配项的所有行的计数,请使用SELECT COUNT(*) ...

如果您想要所有节点计数的总和,请使用:

SELECT SUM(EXTRACTVALUE( 
         UNCOMPRESS(`test__request`),  
         'count(/a/b/c/d[contains(text(),"\n")])'
       ))
FROM testTable16
WHERE  `test_created` >  '2014-08-16 10:00:00'
AND  `test_created` <=  '2014-08-16 10:10:00'
AND  `test_client` =  'test2'
AND  `test_user` =  'testuser2'
AND UNCOMPRESS(`test__request`) LIKE '%<testID>test</testID>%'

【讨论】:

  • 我对组功能的使用无效。
  • @MatthewUnderwood 哦,对不起,计数需要在 XPATH 内。我会更新。
  • 我认为这已经奏效了,当我添加更多标签时计数会减少,这是我所期望的,我要做的是将限制设置为 30 并检查返回的 XML 数据。然后我会给你投票并将你标记为正确。不会很长。
  • 酷,很高兴为您提供帮助.. 添加更多标签时计数会减少?您是指WHERE 条件/XPATH 条件吗?如果您的意思是 XML,那么计数应该只会增加!请记住 LIMIT 最后应用,因此它不会影响 MySQL 聚合 COUNT(*)SUM(...)
  • 是的,我指的是 WHERE,所有行都应包含标签 a 和 b,但 c 和 d 可以是可选的(它特定于我的工作)。因此,我希望当 a/d/c 而不是 a/b 时,计数会更低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多