FinalFantasy Geschrieben 10. Mai 2010 Teilen Geschrieben 10. Mai 2010 Ich habe zwei Tabellen, die ich über einen Wert verbinden will. Jedoch sind die Werte nicht gleich, es sind allerdings Zahlen. Ich will die Tabelle jetzt mit dem nächstgelegenen Wert in der anderen Tabelle verbinden. Beispiel: Tabelle A: Idx | Wert 1 | A 2 | B 5 | C 9 | D Tabelle B: Idx | Wert 1 | a 4 | b 7 | c 8 | d [/PHP] Ich nehme Tabelle A als Basis, mit diesem Pseudeselect: [PHP] SELECT A.Wert, B.Wert FROM A, B WHERE A.Idx = B.Idx AND A.Idx = 2 Das liefert mir natürlich "A a" als Ergebnis. SELECT A.Wert, B.Wert FROM A, B WHERE A.Idx = B.Idx AND A.Idx = 5 [/PHP] Das geht natürlich so nicht. Ich hätte jetzt aber gern als Ergebnis, dass er dann aus Tabelle B einfach den nächstgelegenen Wert nimmt. In diesem Fall wäre das B.Idx 4, das Ergebnis also "C b". Sollten zwei B-Werte exakt gleich weit entfernt sein, hätte das Ergebnis zwei Sätze. Die größe Frage: Ist sowas direkt in SQL möglich (in einem einzigen Select), oder muss ich mir da selbst etwas basteln? Ich benutze SQLite3. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 10. Mai 2010 Teilen Geschrieben 10. Mai 2010 Verstehe ich das richtig, dass Du so etwas haben willst wie ein ceil? D.h. er soll den nächsten Wert >= finden und damit verknüpfen? Sollte dann so aussehen (ungetestet) select * from A JOIN B ON B.idx >= A.idx Ein Join hat ja eine Condition über die er die Daten verknüpft, da kann man natürlich auch andere Verknüpfungsoperatoren nehmen. Bei SQLite ist man natürlich etwas vom Syntax etwas eingeschränkt. Vielleicht kannst Du das Problem etwas anschaulicher schildern Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 10. Mai 2010 Autor Teilen Geschrieben 10. Mai 2010 Nein, so funktioniert das nicht ganz. Abgesehen davon, dass dein Select alle Einträge aus B mit größerem Wert liefert, also nicht nur einen Datensatz, sondern viele, will ich den am nähest gelegenen Wert, der kann mal größer sein, aber auch eben ein kleinerer. Konkreter Fall, ich habe zwei Tabellen mit Timestamps. Die Daten in beiden Tabellen stammen von unterschiedlichen Quellen, es wäre also purer Zufall, wenn Timestamps in beiden Tabellen exakt gleich sind. Ich will diese Werte aber zueinander zuordnen. Ich sage mal, Tabelle A ist meine priorisierte Tabelle und ich will jetzt aus Tabelle B den Datensatz der zeitlich am nähesten an dem in Tabelle A liegt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 10. Mai 2010 Teilen Geschrieben 10. Mai 2010 Ich sage mal, Tabelle A ist meine priorisierte Tabelle und ich will jetzt aus Tabelle B den Datensatz der zeitlich am nähesten an dem in Tabelle A liegt. Ich denke da wirst Du gerade bei SQLite nichts passendes finden. Ich würde das über eine weitere Tabelle lösen, bei der die entsprechenden Datensätze verknüpft werden. D.h. Du musst, wenn Du die Timestamps einfügst direkt den passenden "nächsten" Datensatz suchen. In einem anderen DBMS würde ich das über eine Stored Procedure lösen, die mir immer den nächsten Datensatz sucht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 10. Mai 2010 Autor Teilen Geschrieben 10. Mai 2010 Hmm, hab ich befürchtet, dass das nicht out of the box geht. Na dann muss ich da wohl was basteln. Wollte nur vermeiden, das Rad neu zu erfinden, falls es da schon was gegeben hätte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 10. Mai 2010 Teilen Geschrieben 10. Mai 2010 SQLite ist zwar echt schön, wenn man etwas out-of-box braucht, aber für komplexere Sachen sieht es da einfach schlecht aus. Was evtl gehen würde, wenn SQLite Subselects unterstützt, dass Du so etwas machen würdest: select * from A Join B on A.idx=(select idx from B where idx>=A.idx limit 1) Der Subselect würde durch das limit genau einen oder keinen Datensatz liefern, der >= den Wert von A ist. Ggf wäre es da ratsam auf der Mailingliste direkt nach zu fragen http://www.sqlite.org/support.html Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 10. Mai 2010 Autor Teilen Geschrieben 10. Mai 2010 Ja, das ist mir klar, nur das liefert mit unter Umständen einen Datensatz aus B der erst 10 Sekunden später aufgenommen wurde, obwohl der vorherige vielleicht nur 0,1 Sekunde weit weg wär. Und genau das will ich nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 10. Mai 2010 Teilen Geschrieben 10. Mai 2010 Ja, das ist mir klar, nur das liefert mit unter Umständen einen Datensatz aus B der erst 10 Sekunden später aufgenommen wurde, obwohl der vorherige vielleicht nur 0,1 Sekunde weit weg wär. Und genau das will ich nicht. Du musst doch nur das Minimum der nächsten Beträge der Datensätze bestimmen !? ABS und MIN müsstest Du nur verwenden Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 10. Mai 2010 Autor Teilen Geschrieben 10. Mai 2010 Ne, das funktioniert so leider nicht. Ich versuch noch ein Beispiel: In Tabelle A hab ich einen Datensatz, mit sagen wir 15:00 Uhr. In Tabelle B sind jetzt die Datensätze: 14:59 15:31 16:47 in diesem Fall will ich als Ergebnis die 14:59 haben, weil es ma nähesten an 15:00 liegt. Anderer Fall für Tabelle B: 14:21 15:09 15:36 In diesem Fall will ich die 15:09 als Ergebnis kriegen. Ist das verständlicher? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 10. Mai 2010 Autor Teilen Geschrieben 10. Mai 2010 Also im simpelsten Fall muss ich das nächst kleinere UND das nächst größere Selektieren, dann die Differenzen ausrechnen und dann je nach Ergebnis, das eine oder andere Verwenden... jaaaa, jetzt versteh ich was du gemeint hast... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 10. Mai 2010 Teilen Geschrieben 10. Mai 2010 jaaaa, jetzt versteh ich was du gemeint hast... genau, man kann das via SQL recht elegant so erledigen, dass man eben das ganze Betragsweise (abs) berechnet und über die Ergebnismenge das Minimum (min) bildet. Durch den Betrag fallen die Vorzeichen der Differenzen weg und Min liefert dir dann den kleinsten Wert Du solltest halt so weit wie möglich immer mengenorientiert arbeiten, d.h. berechne die Differenzen zu allen Datensätzen aus und bildet Betrag und Minimum der Menge Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 10. Mai 2010 Autor Teilen Geschrieben 10. Mai 2010 Ja, das könnte funktionieren. Ich werde das mal testen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.