我刚刚运行了这个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。
提前致谢
答案 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)
这将运行查询结果为0
或1
的位置:
<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结尾)