Position eines Datensatzen in einer Rückgabe(?!?)
Position eines Datensatzen in einer Rückgabe(?!?)
am 14.07.2006 16:18:05 von Lorenz Haas
Hallo,
ich habe (vereinfacht) eine Tabelle mit den Feldern `id` und `Sndsw` (Spalte
nach der sortiert wird!). Nun will ich an einem speziellen Punkt wissen,
als wievielter Datensatz die Zeile mit der `id` = 125 ausgegeben wird.
Im Moment mache ich das noch mit Hilfe eines externen "Programmes", dass
sich alle Datensätze via "SELECT `id` FROM xyz ORDER BY `Sndsw`" ausgeben
lässt und dann eine Schleife solange laufen lässt, bis eben `id` gleich der
gesuchten Zahl ist. Somit erhalte ich dann auch die Position dieses
Datensatzes im globalen Ergebnis.
Ist es möglich diese Position auch durch einen reinen SQL-Ausdruck
abzufragen?
Danke
Lorenz
Re: Position eines Datensatzen in einer Rückgabe (?!?)
am 14.07.2006 16:33:09 von ascii158
Lorenz Haas wrote:
> Hallo,
>
> ich habe (vereinfacht) eine Tabelle mit den Feldern `id` und `Sndsw` (Spalte
> nach der sortiert wird!). Nun will ich an einem speziellen Punkt wissen,
> als wievielter Datensatz die Zeile mit der `id` = 125 ausgegeben wird.
>
>[...]
>
> Ist es möglich diese Position auch durch einen reinen SQL-Ausdruck
> abzufragen?
SET @x=0; SELECT * FROM (SELECT (@x:=@x+1), id, Sndsw FROM xyz) a WHERE
id=125;
Das ist zwar nicht elegant, tut aber im kurzen Test hier.
GrüÃe,
--
Philipp Tölke
PGP 0x96A1FE7A
Re: Position eines Datensatzen in einer Rückgabe (?!?)
am 14.07.2006 16:34:39 von ascii158
Philipp Tölke wrote:
>SET @x=0; SELECT * FROM (SELECT (@x:=@x+1), id, Sndsw FROM xyz ORDER BY
Sndsw) a WHERE id=125;
Natürlich. Ich hatte das ORDER BY vergessen.
--
Philipp Tölke
PGP 0x96A1FE7A
Re: Position eines Datensatzen in einer Rückgabe(?!?)
am 14.07.2006 16:40:44 von Lorenz Haas
Philipp Tölke wrote:
> SET @x=0; SELECT * FROM (SELECT (@x:=@x+1), id, Sndsw FROM xyz) a WHERE
> id=125;
Werd ich nachher gleich testen, aber kannst Du mir vorher bitte noch sagen
unter welchem Stichwort ich im Manual etwas zu @x finde.
Danke
Lorenz
Re: Position eines Datensatzen in einer Rückgabe (?!?)
am 14.07.2006 16:43:28 von Christian Kirsch
Lorenz Haas schrieb:
> Philipp Tölke wrote:
>
>> SET @x=0; SELECT * FROM (SELECT (@x:=@x+1), id, Sndsw FROM xyz) a WHERE
>> id=125;
>
> Werd ich nachher gleich testen, aber kannst Du mir vorher bitte noch sagen
> unter welchem Stichwort ich im Manual etwas zu @x finde.
>
>
User variables
Re: Position eines Datensatzen in einer Rückgabe (?!?)
am 14.07.2006 17:21:09 von Johannes Vogel
Hi Lorenz
Lorenz Haas wrote:
> ich habe (vereinfacht) eine Tabelle mit den Feldern `id` und `Sndsw` (Spalte
> nach der sortiert wird!). Nun will ich an einem speziellen Punkt wissen,
> als wievielter Datensatz die Zeile mit der `id` = 125 ausgegeben wird.
> Im Moment mache ich das noch mit Hilfe eines externen "Programmes", dass
> sich alle Datensätze via "SELECT `id` FROM xyz ORDER BY `Sndsw`" ausgeben
> lässt und dann eine Schleife solange laufen lässt, bis eben `id` gleich der
> gesuchten Zahl ist. Somit erhalte ich dann auch die Position dieses
> Datensatzes im globalen Ergebnis.
> Ist es möglich diese Position auch durch einen reinen SQL-Ausdruck
> abzufragen?
select count(*) from tabelle
where sndsw < (select sndsw from tabelle where id = $id);
HTH, Johannes
Re: Position eines Datensatzen in einer Rückgabe(?!?)
am 15.07.2006 07:50:45 von Lorenz Haas
Johannes Vogel wrote:
> select count(*) from tabelle
> where sndsw < (select sndsw from tabelle where id = $id);
Hi,
Deine Lösung ist sehr schön, scheitert aber dann, wenn 'sndsw' nicht
eindeutig ist.
id | sndsw
----------
1 | 0
2 | 0
3 | 1
4 | 1
Suche nach id=4 liefert 2, wenngleich 3 richtig wäre.
Trotzdem Danke
Lorenz
Re: Position eines Datensatzen in einer Rückgabe(?!?)
am 15.07.2006 07:56:56 von Lorenz Haas
Philipp Tölke wrote:
>> SET @x=0; SELECT * FROM (SELECT (@x:=@x+1), id, Sndsw FROM xyz ORDER BY
>> Sndsw) a WHERE id=125;
Dake, funktioniert perfekt.
Lorenz
Re: Position eines Datensatzen in einer Rückgabe(?!?)
am 15.07.2006 09:30:29 von Matthias Esken
On Sat, 15 Jul 2006 07:50:45 +0200, Lorenz Haas wrote:
> Johannes Vogel wrote:
>> select count(*) from tabelle
>> where sndsw < (select sndsw from tabelle where id = $id);
>
> Deine Lösung ist sehr schön, scheitert aber dann, wenn 'sndsw' nicht
> eindeutig ist.
>
> id | sndsw
> ----------
> 1 | 0
> 2 | 0
> 3 | 1
> 4 | 1
>
> Suche nach id=4 liefert 2, wenngleich 3 richtig wäre.
"Richtig" ist hier nicht ganz richtig. :-) Wenn du hier nach sndsw
sortierst kannst du die ids in folgenden Reihenfolgen erhalten:
1 2 3 4
1 2 4 3
2 1 3 4
2 1 4 3
Alles davon ist ein korrektes Ergebnis.
Gruß,
Matthias
Re: Position eines Datensatzen in einer Rückgabe(?!?)
am 15.07.2006 10:15:50 von Lorenz Haas
Matthias Esken wrote:
> 1 2 3 4
> 1 2 4 3
> 2 1 3 4
> 2 1 4 3
>
> Alles davon ist ein korrektes Ergebnis.
Einzeln betrachtet sicherlich, aber nicht für meine Zielsetzung die Position
eines Datensatzes inerhalb einer Rückgabemenge zu bestimmen. Die Methode
von Philipp dagegen, wenn auch nicht elegant - wie er meint -, liefert bei
allen Eventualitäten ein der Zielgabe entsprechend richtiges Ergebnnis.
Ein schönes Wochenende
Lorenz
Re: Position eines Datensatzen in einer Rückgabe (?!?)
am 15.07.2006 11:44:25 von Johannes Vogel
Hi Lorenz
Lorenz Haas wrote:
> Johannes Vogel wrote:
>> select count(*) from tabelle
>> where sndsw < (select sndsw from tabelle where id = $id);
> Deine Lösung ist sehr schön, scheitert aber dann, wenn 'sndsw' nicht
> eindeutig ist.
> id | sndsw
> ----------
> 1 | 0
> 2 | 0
> 3 | 1
> 4 | 1
> Suche nach id=4 liefert 2, wenngleich 3 richtig wäre.
Falls du keine Eindeutigkeit in sndsw hast, gibt es auch keine
Eindeutigkeit in der Sortierung und damit keine Eindeutigkeit bzgl
Position. Wenn du also die Eindeutigkeit suchst, jedoch keine
Eindeutigkeit im Attribut vorgibst, so musst du an deiner Datenmenge was
ändern.
Das ist in Philipps Lösung nicht anders.
HTH, Johannes
Re: Position eines Datensatzen in einer Rückgabe(?!?)
am 15.07.2006 13:43:40 von Matthias Esken
On Sat, 15 Jul 2006 10:15:50 +0200, Lorenz Haas wrote:
> Matthias Esken wrote:
>> 1 2 3 4
>> 1 2 4 3
>> 2 1 3 4
>> 2 1 4 3
>>
>> Alles davon ist ein korrektes Ergebnis.
>
> Einzeln betrachtet sicherlich, aber nicht für meine Zielsetzung die Position
> eines Datensatzes inerhalb einer Rückgabemenge zu bestimmen. Die Methode
> von Philipp dagegen, wenn auch nicht elegant - wie er meint -, liefert bei
> allen Eventualitäten ein der Zielgabe entsprechend richtiges Ergebnnis.
Eher zufällig. Garantieren kann dir das auch keiner.
Der Punkt ist doch, dass du derzeit anscheinend davon ausgehst, dass die
Datensätze bei gleichem Sortierkriterium automatisch nach der ID sortiert
ausgegeben werden. Das muss nicht so sein und damit liefert dann auch
Philipps Methode ein "falsches" Ergebnis. Wenn du natürlich die ID als
zusätzliches Sortierkriterium aufnimmst, dann bekommst du mit beiden
Varianten immer das gewünschte Resultat.
Gruß,
Matthias
Gruß,
Matthias
Re: Position eines Datensatzen in einer Rückgabe(?!?)
am 16.07.2006 17:58:57 von Lorenz Haas
Johannes Vogel wrote:
> Falls du keine Eindeutigkeit in sndsw hast, gibt es auch keine
> Eindeutigkeit in der Sortierung und damit keine Eindeutigkeit bzgl
> Position.
Hallo Johannes,
ich befürchte, dass wir etwas aneinander vorbeireden, oder dass ich falsche
Prämissen bzgl. MySQL habe.
Also, wenn die Werte einer Spalte nicht eindeutig sind, und ich nach ihnen
eine Tabelle ordnen lasse, können theoretisch Permutation zwischen den
Ergebnisen verschiedener Sortierungen auftreten. Aber doch nicht wenn immer
die gleiche "Anfangstabellenordnung" besteht, und nach gleichbleibendem
Algorithmus und Optionen sotiert wird. Dann ist doch die Reihenfolge der
Ausgabe der neu geordneten Tabelle immer gleich.
Also wenn ich "select id from tabelle order by sndsw" auf eine Tabelle
loslasse, dann bekomme ich doch von MySQL immer die gleiche Reihenfolge der
id zurück (vorausgesetzt die Tabelle als Ganze ändert sich nicht). Also
wenn das stimmt, dann bekomme ich doch immer ein eindeutiges Ergebnis,
wenngleich die Sortierungspalte in sich nicht eindeutig ist.
> Das ist in Philipps Lösung nicht anders.
Doch. Test mit
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`sndsws` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `test` (`id`, `sndsws`) VALUES (0, 0),
(1, 0),
(2, 1),
(3, 1);
mysql> select count(*) from hermes.test where sndsws < (select sndsws from
hermes.test where id = 2);
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from hermes.test where sndsws < (select sndsws from
hermes.test where id = 3);
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
mysql> SET @x=0; SELECT * FROM (SELECT (@x:=@x+1) as count, id FROM
hermes.test ORDER BY sndsws) a WHERE id=2;
Query OK, 0 rows affected (0.00 sec)
+-------+----+
| count | id |
+-------+----+
| 3 | 2 |
+-------+----+
1 row in set (0.00 sec)
mysql> SET @x=0; SELECT * FROM (SELECT (@x:=@x+1) as count, id FROM
hermes.test ORDER BY sndsws) a WHERE id=3;
Query OK, 0 rows affected (0.00 sec)
+-------+----+
| count | id |
+-------+----+
| 4 | 3 |
+-------+----+
1 row in set (0.00 sec)
Ciao,
Lorenz
Re: Position eines Datensatzen in einer Rückgabe (?!?)
am 16.07.2006 20:57:20 von ascii158
Lorenz Haas wrote:
> Also wenn ich "select id from tabelle order by sndsw" auf eine Tabelle
> loslasse, dann bekomme ich doch von MySQL immer die gleiche Reihenfolge der
> id zurück (vorausgesetzt die Tabelle als Ganze ändert sich nicht).
Jein. IANADBW, aber:
Du bekommst bei zwei direkt hintereinander ausgeführten Statements
ziemlich sicher das gleiche Ergebnis. Aber jede Aktion, die die interne
Struktur der Datenbank verändert (INSERT, UPDATE, DELETE, ALTER,
vielleicht auch noch REORGANIZE TABLE [oder wie das heisst]), sorgt
dafür, das Sortierreihenfolge sich ändern /kann/. In wie weit hängt von
der benutzten Engine, den Indices und ich denke auch von der
Konfiguration (Caches) ab.
GrüÃe,
--
Philipp Tölke
PGP 0x96A1FE7A
Re: Position eines Datensatzen in einer Rückgabe (?!?)
am 17.07.2006 00:21:02 von Johannes Vogel
HI Lorenz
Lorenz Haas wrote:
> Johannes Vogel wrote:
>> Falls du keine Eindeutigkeit in sndsw hast, gibt es auch keine
>> Eindeutigkeit in der Sortierung und damit keine Eindeutigkeit bzgl
>> Position.
> ich befürchte, dass wir etwas aneinander vorbeireden, oder dass ich falsche
> Prämissen bzgl. MySQL habe.
Nein, wir reden nicht aneinander vorbei. Ausser wenn du meinst, dich auf
den Spezialfall verlassen zu können.
> Also, wenn die Werte einer Spalte nicht eindeutig sind, und ich nach ihnen
> eine Tabelle ordnen lasse, können theoretisch Permutation zwischen den
> Ergebnisen verschiedener Sortierungen auftreten. Aber doch nicht wenn immer
> die gleiche "Anfangstabellenordnung" besteht, und nach gleichbleibendem
> Algorithmus und Optionen sotiert wird. Dann ist doch die Reihenfolge der
> Ausgabe der neu geordneten Tabelle immer gleich.
Nein. Wenn du keine Eindeutigkeit in den Daten vorweisen kannst, wird
dir das DBS die Daten nach Belieben sortieren. Deshalb ist die
Eindeutigkeit nicht gegeben. Philipp hat dir ja bereits geschrieben, in
welchen Fällen dein Speziallfall nicht klappen wird.
> Also wenn ich "select id from tabelle order by sndsw" auf eine Tabelle
> loslasse, dann bekomme ich doch von MySQL immer die gleiche Reihenfolge der
> id zurück (vorausgesetzt die Tabelle als Ganze ändert sich nicht). Also
> wenn das stimmt, dann bekomme ich doch immer ein eindeutiges Ergebnis,
> wenngleich die Sortierungspalte in sich nicht eindeutig ist.
Korrekt ist, dass zwei gleichwertige Einträge die selbe Positionsnummer
erhalten müssen. Wenn zwei Leute genau gleich schnell den Hang herunter
skien, erhalten beide denselben Rang. Hier verhält es sich gleich:
Es gibt nun verschiedene Möglichkeiten, hiermit umzugehen:
Bspw. die Liste round(0.49, 1.01, 0.09, 1.0, 1.001, 1.9).
a) alle erhalten den besten Rang (1, 2, 2, 2, 2, 6)
b) alle erhalten den Mittelwert (1, 3.5, 3.5, 3.5, 3.5, 6)
c) alle erhalten den abgerundeten Mittelwert (1, 3, 3, 3, 3, 6)
d) alle erhalten den aufgerundeten Mittelwert (1, 4, 4, 4, 4, 6)
e) alle erhalten den schlechtesten (1, 5, 5, 5, 5, 6)
zu c/d: Manchmal will man Kommastellen vermeiden, möchte aber trotzdem
auf den Mittelwert gehen. Bei ungerader Anzahl gleichgrosser Werte sind
ja b, c und äquivalent. Man könnte auch den Median wählen, wobei das
hier mangels Ausreisser sinnlos wäre.
Wichtig ist hier aber, dass alle Werte, die gleich gross sind, auch
denselben Rang erhalten. Und die Position in deiner sortierten Liste ist
nichts anderes als ein Rang.
Das mag nicht auf deine Aufgabenstellung passen, weil du wahrscheinlich
aus einer (Produkt-)Detailsicht wieder in die Ãbersicht springen willst
und dafür die passende Seite anzeigen willst. Aber es ist nicht selten,
dass man in den NG nicht diejenige Antwort lesen kann, die man sich
erhofft. Grundsätzlich müsstest du dir Gedanken über die Eindeutigkeit
der Sortierung deiner Liste machen. Bspw. indem du noch weitere
Kriterien hinzufügst.
Viel Glück,
Johannes
Re: Position eines Datensatzen in einer Rückgabe(?!?)
am 17.07.2006 07:43:50 von Lorenz Haas
Johannes Vogel wrote:
> Das mag nicht auf deine Aufgabenstellung passen, weil du wahrscheinlich
> aus einer (Produkt-)Detailsicht wieder in die Ãbersicht springen willst
> und dafür die passende Seite anzeigen willst. Aber es ist nicht selten,
> dass man in den NG nicht diejenige Antwort lesen kann, die man sich
> erhofft.
Ist mir bewusst. Ich war nur der falschen Meinung, dass MySQL immer die
gleiche Tabelle als Ausgangspunkt nimmt. Jetzt -nach einigem Sträuben- ist
auch mir klar, dass es nicht so ist.
> Grundsätzlich müsstest du dir Gedanken über die Eindeutigkeit
> der Sortierung deiner Liste machen. Bspw. indem du noch weitere
> Kriterien hinzufügst.
Für mein derzeitiges Anliegen ist eine leichte Ungenauigkeit kein Problem,
ich wollte das ganze nur richtig verstehen, für den Fall, dass ich
anderweitig einmal eine exakte Lösung bräuchte.
Vielen Dank,
Lorenz