# Tuple position



## PollerJava (20. Jun 2011)

Hi,

ich möchte mittels einem Select eine Abfrage absetzen welche eigentlich nur einen Rückgabe- Tupel erlaubt:


```
pk       fn            sn      amount
1        Hans      Huber    44
2        Walter    Meier     54
3        Michael   Wimmer  21
4        Franz      Meinrad  98
```

Ich habe als Ausgang für das Select z.B.: Walter Meier und möchte wissen, wieviele Personen es gibt wo der amount kleiner ist als bei Walter Meier bzw. an welcher Reihe er ist mit seinem amount (also in diesem Fall 3 -> Wimmer und Huber sind kleiner).
Kann ich das mit einem Select herausbekommen.
lg


----------



## SlaterB (20. Jun 2011)

z.B.
select a..., count(*) from Person a, Person b 
where a.id != b.id and  .. and  a.x > b.x


----------



## PollerJava (21. Jun 2011)

Hallo,

ich habs jetzt mit der Abfrage oben versucht, mir ist es aber nicht ganz gelungen.
Wenn ich den mit dem kleinsten amount abfragen will, bekomme ich statt 1->2, beim zweiten statt 2->3 usw.
Weiß jemand was ich da noch falsch mache?
Danke!!!


```
select pd1.amount, COUNT(*) from PersonData as pd1, PersonData as pd2, Person as p
       where pd1.id_part=p.pk_part   // verknüpfung zwischen den 2 Tabellen (1:n -> Person (1) kann mehrere PersonData (n) haben)
       and p.firstname = 'Hans'
       and pd1.id != pa2.id and pd1.amount > pd2.amount;
```


----------



## SlaterB (21. Jun 2011)

> AND pd1.id != pa2.id
was ist denn pa2?

lasse zunächst Besonderheiten wie mehr als zwei Tabellen weg, frage notfalls alle Ids ab um genau zu erkennen, was alles gezählt wird,

ohne Gruppierung nach dem pd1.amount oder was immer direkt abgefragt wird sollte jedes count() im Moment eh 1 ergeben,
Gruppierung hatte ich vergessen, deine Ergebnisse sind dann noch merkwürdiger

select a.id, b.id from Person a, Person b
where a.id != b.id and a.name = xy and a.x > b.x 

sollte eine  genaue Auflistung geben, etwa
23, 24
23, 25
23, 26
also 23 als Id zum Namen, genau die Ids 24, 25 und 26 sind noch kleiner



select a.id, count(*) from Person a, Person b
where a.id != b.id and .. and a.x > b.x 
group by a.id

sollte dann 23 + count 3 zurückgegeben


----------



## PollerJava (21. Jun 2011)

pd2.id ist gemeint statt pa2.id


----------



## SlaterB (21. Jun 2011)

wie immer gilt: nur einen Teil zu beantworten und zum Rest nichts zu sagen, nicht mal 'dazu schaue ich noch nach', funktioniert nicht

welche Antwort der Welt könnte ich jetzt noch schreiben?
keine, steht alles in der vorherigen, falls du auf was neues von mir wartest


----------



## PollerJava (24. Jun 2011)

Es tut mir echt leid, aber ich schaffe es nicht, diese Abfrage zu machen, sodass das Richtige herauskommt.
Ich versuch mein Problem nochmals genauer zu beschreiben: 

Ich hab 3 Tabellen: 


```
Veranstaltung                             PersonData                            Person
veranstaltungsname      1:n         kategorie amount       n:1               name

 V1                                   V1  k1             12                              Hans
 V2                                   V1  k1             3                               Franz
                                       V1  k1             7                               Sepp
                                       V2  k2             4                              Walter
                                       V1  k1             6                               Herman
```

und ich möchte jetzt abfragen an welcher Stelle z.B. Sepp ist in der Kategorie k1, Also da müsste dann 3 rauskommen da Franz und Herman vor Sepp sind.
Mein Problem ist, dass ich da 4 rausbekomme, da Walter zwar nicht die gleiche Kategorie hat - und ich das zwar abfrage - aber es trotzdem mitgezählt wird und das versteh ich nicht - bei mir kommt also 4 raus.
Hättet Ihr da noch eine Idee wie ich das machen kann, ich versuch das jetzt schon 3 tage aber es gelingt mir nicht


```
Select pa1.amount, COUNT(*) from
(Select * From persondata as pa, person as p, tevent as e where pa.id_part = p.pk_part
and pa.id_event = e.pk_event and pa.kategorie= 'k1' and e.eventname = 'V1'
and e.eventtime = '2011-06-06 09:30:00') as pa1, person as pa2, person as p1
where pa1.id_persondata != pa2.id_persondata and pa1.id_part=p1.pk_part and pa1.amount > pa2.amount and p1.firstname = 'Sepp';
```


----------



## SlaterB (25. Jun 2011)

es muss dir nichts leid tun und du musst auch nichts schaffen nur irgendwelche Rückmeldung geben wie das letzte Posting jetzt ein viel besseres als das davor war,

weiterhin gilt aber, ich kann mich praktisch doch nur wiederholen, aber zumindest auf kontretes SQL von dir bezogen: 
lasse persondata als Verkomplizierung vorerst weg,
wieso ist eigentlich dieses persondata = pa1, dann die erste person pa2 und die zweite person p1?
mit so abwegiger Benennung ist das ja ganz schwer zu verfolgen, aber vorerst nur mit erste person p1 und die zweite person p2

wie gesagt geht count(*) nicht besonders ohne group by, was group by ist kannst du nachschlagen oder fragen,
nur 'ich weiß nix' hilft nix

wie gesagt erstmal auch auf die Zählung überhaupt verzichten sondern nur den Join zwischen den beiden Personen-Tabellen,
wie du ihn ungefähr hast und allein die Ergebnisse anschauen, also die Ids beider Personen anschauen oder gleich alle Attribute,
welche p2 werden zu p1 geliefert usw.

wenn was nicht klappt poste SQL so weit du kommst (persondata zu entfernen wäre anscheinend schon ein RIESIGER Fortschritt),
sofern schon irgendwas klappt interessante Ergebnisse der Anfragen auch posten


----------

