2015-09-27 2 views
1

Я просто управлял этим XQuery, и она работает просто отличноМножественные запросы с 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> 

Однако ни я не хотел бы, чтобы запустить этот запрос для $ е/@ результата = 1 тоже. Как я могу это сделать? Я хотел бы избежать создания нового xquery.

Заранее спасибо

ответ

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> 
+0

Замечательно, любая информация о том, как вызвать basex из автономного (что автономно использовать)? Как система знает, куда идти и искать файл xquery? Я думаю, должен быть заменен на <фактическое имя файла xquery>? Спасибо за вашу помощь! – Koen

+0

Вы выполняете BaseX, как и любую другую программу с вашей конкретной операционной системой. Пожалуйста, ознакомьтесь с нашей документацией по адресу http://docs.basex.org/wiki/Main_Page, чтобы ответить на ваши основные вопросы. – dirkk

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 несколько вводит в заблуждение, хотя оно будет alwa ys имеет счет 1, потому что вы повторяете поток кортежа.

+0

Привет, спасибо вам большое за ваш ответ. Это интересно, но не совсем то, на что я надеялся. Возврат теперь равен 55, который представляет собой сумму результата = 1 (44) и результат = 0 (11). Любая идея, как можно увидеть их обоих отдельно, а не сумму? Заранее спасибо P.S .: Что такое кортеж? – Koen

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> 

I сначала получили результаты кандидата, прежде чем создавать список возможных результатов (0 и 1), а не дополнительные значения, которые могут быть найдены в других записях и не совпадают здесь. Вот почему нет результата типа = «2», хотя я засеял данные одним для теста (игрок, заканчивающийся на 999)

Смежные вопросы