Abfrage bitte helfen Sie mir zu verstehen, wie diese Art von Abfrage mit xquery schreiben. Ich habe dieses .xml:xquery Hilfe, um Produkte und Benutzer von einem anderen Element Knoten
<auctions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<products>
<product id="1">
<name>Name1</name>
</product>
<product id="2">
<name>Name2</name>
</product>
<product id="3">
<name>Name3</name>
</product>
<product id="4">
<name>Name4</name>
</product>
</products>
<users>
<user username="Kukuk1">
</user>
<user username="Kukuk2">
</user>
<user username="Kukuk3">
</user>
</users>
<bids>
<product id="1">
<bid user="Kukuk1">400</bid>
<bid user="Kukuk2">410</bid>
<bid user="Kukuk1">450</bid>
</product>
<product id="2">
<bid user="Kukuk3">200</bid>
<bid user="Kukuk2">300</bid>
</product>
<product id="3">
<bid user="Kukuk1">150</bid>
</product>
</bids>
</auctions>
und ich brauche diese Ausgabe zu erhalten, wie folgt: Der Benutzer „Kukuk1“ bekam die Produkte „Name1“ (mit dem Wert „450“) und „Name3“ (mit dem Wert "150). Der Benutzer" Kukuk3 "hat keine Produkte gewonnen. Der Benutzer" Kukuk2 "gewann die Produkte" Name2 ".
Die Elemente sollten von Benutzer aufsteigend sortiert werden und die Elemente Produkt nach Wert absteigend, sollte aussehen dies:
<got>
<user name="Kukuk1">
<product value="450">Name1</product>
<product value="150">Name3</product>
</user>
<user name="Kukuk3"/>
<user name="Kukuk2">
<product value="300">Name2</product>
</user>
</got>
Das ist, was ich habe, so weit:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:item-separator "
";
<got>
{
for $u in (//auctions/users/user)
let $p:= //auctions/products
let $v := //auctions/bids/product
let $max1 := max($v/bid)
let $max2 := max($v/bid[4])
let $got := //auctions/bids/product
let $won-product := $got[@id=$p/product/@id]
order by $u
return
if ($u/@username="Kukuk1") then
(<user name="{fn:string($u/@username)}">

<product value="{$max1}">{fn:string($p/product[1]/name)}</product>

</user>,'
')
else
if
($u/@username="Kukuk3") then
(<user name="{fn:string($u/@username)}"> 
<product value="{$max2}">{fn:string($p/product[2]/name)}</product>
</user>,'
')
else
if
($u/@username="Kukuk2") then
(<user name="{fn:string($u/@username)}">

<product value="{$max2}">{fn:string($p/product[3]/name)}</product>

</user>,'
')
else()
}
</got>
Und ich bin immer diese Ausgabe:
<got>
<user name="Kukuk1">
<product value="450">Name1</product>
</user>
<user name="Kukuk3">
<product value="">Name2</product>
</user>
<user name="Kukuk2">
<product value="">Name3</product>
</user>
</got>
Vielen Dank, das ist eine Menge Hilfe. Der Kuku3 hat ein gültiges Gebot, aber er hat das Produkt nicht bekommen, weil sein Gebot 200 war und das Gebot von Kukuk2 300 war :) - wie bekomme ich diese Ausgabe, natürlich mit Zeilenumbrüchen ?: Name1 Name3 < Produktwert = "300"> Name2 –
xaoC
@xaoC Ah, ich verstehe - das war nicht in Ihrem ursprünglichen Beitrag enthalten. Ich habe meine Anfrage entsprechend aktualisiert. Allerdings verstehe ich immer noch nicht, warum Kuku3 vor Kukuk2 ausgegeben werden sollte - Wenn Sie es auf etwas anderes als dem Namen, den Sie möglicherweise angeben möchten, bestellen möchten. Auch in Bezug auf Ihre aktualisierte Frage muss ich sagen, dass ich Ihre Anfrage nicht verstehe oder was Sie erreichen möchten - Es scheint, als wäre es sehr auf diesen kleinen Datensatz zugeschnitten, würde es keinen Sinn machen, es allgemeiner zu machen ohne Haben Sie 'if' für bestimmte Benutzernamen? – dirkk
Ja, Sie haben recht mit dem kleinen Datensatz. Ich bin nur ein Anfänger und möchte xquery lernen. Meine schlechten mit den Namen - sie sollten so zu verstehen sein. Akuk = Kukuk1, Ckuk = Kukuk2, Bkuk = Kukuk3. – xaoC