使用Xquery进行多次查询

时间:2015-09-27 11:59:59

标签: xml xquery basex

我刚刚运行了这个xquery,它运行得很好

<usp>{count(for $e in doc("yyyyyy.xml")/Games/Game/Event

where $e/@player_id = 14937
  and $e/@type_id = 1
  and $e/@outcome = 0

let $c := count($e[Q[@qualifier_id = "2"]])
return if($c<1)
      then $e/@event_id
      else ())}</usp>

但是,我也不想为$ e / @ outcome = 1运行此查询。我怎样才能做到这一点?我想避免为它制作一个新的xquery。

提前致谢

3 个答案:

答案 0 :(得分:0)

您可以在XQuery中定义外部变量,例如像这样:

declare variable $outcome external := 0;
<usp>{count(for $e in doc("yyyyyy.xml")/Games/Game/Event

where $e/@player_id = 14937
  and $e/@type_id = 1
  and $e/@outcome = 0

let $c := count($e[Q[@qualifier_id = "2"]])
return if($c<1)
      then $e/@event_id
      else ())}</usp>

如果您从独立调用basex,则可以使用$outcome

绑定到外部-b变量
basex -b outcome=1 <xquery_file>

答案 1 :(得分:0)

这将运行查询结果为01的位置:

<usp>{
    count(
      for $e in doc("yyyyyy.xml")/Games/Game/Event[@player_id eq 14937][@type_id eq 1][@outcome = (0, 1)]
      let $c := count($e[Q/@qualifier_id eq "2"])
      return
        if($c<1)then
          $e/@event_id
        else
          ()
    )
}</usp>

我认为你的let/return/if语句有点误导,因为它总是有1,因为你正在迭代一个元组流。

答案 2 :(得分:0)

对您的请求的解释略有不同,因为不清楚您是否需要单独(通过变量)或相同结果的答案:

let $game := 
<game>
  <event player_id="14937" type_id="1" outcome="0" event_id="1" qualifier_id="2"/>
  <event player_id="14937" type_id="1" outcome="1" event_id="1" qualifier_id="2"/>
  <event player_id="14937" type_id="1" outcome="1" event_id="1" qualifier_id="2"/>
  <event player_id="14937" type_id="1" outcome="1" event_id="1" qualifier_id="2"/>
  <event player_id="14999" type_id="1" outcome="2" event_id="1" qualifier_id="2"/>
</game>


let $matching-results := for $e in $game/event
    where $e/@player_id = 14937
      and $e/@type_id = 1
      and $e/@qualifier_id = 2
  return $e

return <usp>
      {
      for $outcome-type in fn:distinct-values($matching-results/@outcome)
        let $outcome-count := fn:count($matching-results[@outcome=$outcome-type])
        return <outcome type="{$outcome-type}">{$outcome-count}</outcome>
      }
</usp>

结果:

<usp>
    <outcome type="0">1</outcome>
    <outcome type="1">3</outcome>
</usp>

我首先在创建结果可能性列表(0和1)之前获得候选结果,而不是在其他记录中找到的其他值,而不是在此处匹配。这就是为什么没有结果类型=&#34; 2&#34;即使我用一个测试播种数据(播放器以999结尾)