SQL-Abfrage fehlerhaft ?
Dieter
- datenbank
0 Maxwell0 Rouven0 Dieter0 King^Lully0 Rouven
0 King^Lully0 Dieter
Hallo,
irgendwie komme ich nicht weiter. Ich habe in meiner DB (MySQL)
folgende Sätze:
(db01)
id | agid | bustart | buende
3 | 1 | 1188986401 | 1189418399
2 | 2 | 1188986401 | 1189418399
4 | 2 | 1199790001 | 1203245999
8 | 1 | 1199790001 | 1203245999
13 | 1 | 1180692001 | 1183283999
Meine Query lautet:
SELECT * FROM db01 WHERE agid = '1' AND (bustart BETWEEN '1182592801' AND '1182679199') OR (buende BETWEEN '1182592801' AND '1182679199')
Demmnach müsste doch ein Select mindestens einen Treffer rausgeben, da die Query doch zumindest auf den Datensatz mit der ID 13 zutrifft.
Doch leider bekomme ich immer ein Null-Ergebnis...
Habe ich irgendwo einen Denkfehler ???
Gruss
Dieter
Hallo,
SELECT * FROM db01 WHERE agid = '1' AND (bustart BETWEEN '1182592801' AND '1182679199') OR (buende BETWEEN '1182592801' AND '1182679199')
Doch leider bekomme ich immer ein Null-Ergebnis...
Quick-Shot: Meinst du vielleicht:
SELECT * FROM db01 WHERE agid = '1' AND ( (bustart BETWEEN '1182592801' AND '1182679199') OR (buende BETWEEN '1182592801' AND '1182679199') )
vereinfacht:
agid=1 AND ( BED1 OR BED2)
statt deiner Lösung
agid=1 AND BED1 OR BED2
Problem hier: Bool'sche Operatoren werden von links nach rechts aufgelöst => zuerst wird auf agid=1 AND BED1 auf true überprüft und dann mit OR BED2.
Grüsse,
Maxwell
Hello,
Problem hier: Bool'sche Operatoren werden von links nach rechts aufgelöst => zuerst wird auf agid=1 AND BED1 auf true überprüft und dann mit OR BED2.
das ist nicht das Problem. Das Problem ist, dass die Rangfolge Bool'scher Operatoren NOT-AND-OR ist, das heißt die AND-Verknüpfung wird ausgeführt bevor die OR-Verknüpfung ausgeführt wird.
MfG
Rouven
Hello
das ist nicht das Problem. Das Problem ist, dass die Rangfolge Bool'scher Operatoren NOT-AND-OR ist, das heißt die AND-Verknüpfung wird ausgeführt bevor die OR-Verknüpfung ausgeführt wird.
Ah OK, dann war ich doch zu schnell beim Absenden.
Grüsse,
Maxwell
Hallo nochmal,
zuerst danke an alle, insbesondere an Rouven der mir meinen Denkfehler aufgezeigt hatte, da
meine Query vom Ansatz her fehlerhaft ist. Hierfür erstmal sorry für die gemachte Mühe...
Wie ich schon geschrieben hatte, war bzw. ist dieses mein Versuch, über eine Query festzustellen,
ob ein über Timestamps definiertes Zeitfenster ein zweites überschneidet bzw. sich innerhalb dieses
Zeitfensters bewegt. Hierzu habe ich also dementsprechend 4 Werte, wobei Wert 01 und Wert 02
das vorgebene Zeitfenster (A) innerhalb der DB (bustart/buende) darstellen und ich nun über
einen SELECT feststellen möchte, ob sich das Zeitfenster (B), also Wert 03 und Wert 04 innerhalb
dem Zeitfenster (A) sich befindet.
Ich versuche dieses nun mit folgender Anweisung zu realisieren:
SELECT * FROM db01 WHERE agid = 'angebotid' AND ( (WERT03 BETWEEN WERT01 AND WERT02) OR (WERT04 BETWEEN WERT01 AND WERT02) )
(Das nur für alle die ein ähnliches Problem haben und genauso "krumm" denken wie ich)
Vielen Dank nochmal an alle !
Gruss
Dieter
Hallo nochmal,
die Feldtypen sind Zahlenwerte (Dezimal), die Query soll gegegenprüfen ob
a) ein gespeicherter Wert A (bustart) innerhalb Wert 01 und 02 ODER Wert 03 und Wert 04 liegt
und
b) ein gespeicherter Wert B (buende) innerhalb Wert 01 und 02 ODER Wert 03 und Wert 04 liegt
Mit num_rows will ich eigentlich nur dann feststellen, ob die Select zutrifft oder nicht.
Wie kann ich denn eine solche Abfrage erreichen ?
Gruss
Dieter
Hello,
Demmnach müsste doch ein Select mindestens einen Treffer rausgeben, da die Query doch zumindest auf den Datensatz mit der ID 13 zutrifft.
wieso?? Mal vorausgesetzt, dass deine Spalten überhaupt numerischen Typs sind (keine Ahnung, was BETWEEN bei Texten macht) - deine Kriterien beginnen allesamt mit 1182... - ich sehe leider keinen Satz, der 1182 in einer der Spalten hat.
MfG
Rouven
Hallo Rouven,
deine Kriterien beginnen allesamt mit 1182... - ich sehe leider keinen Satz, der 1182 in einer der Spalten hat.
Autsch, ja, Denkfehler.
Jetzt stehe ich aber total auf dem Schlauch.
Ich habe benannte Tabelle in der eine Startzeit und eine Endzeit (bustart/buende) als numerischer Timestamp (änderungen hieran in ein reines Date-Format NICHT mehr möglich) vorliegen.
Nun möchte ich erreichen, das eine Überprüfung erfolgt, die gegenprüft ob ein ebenfalls als Timestamp benannter Zeitraum (Start/Ende) sich mit den gespeicherten Werten überschneidet.
Beispiel:
Gespeicherter Start - 1122990000
Gespeichertes Ende - 1133990000
Zu prüfender Zeitraum:
Start - 11239900
Ende - 11249900
Liegt nun der zu prüfende Zeitraum innerhalb des gespeicherten Zeitfensters ? Hierfür müsste ich entsprechende Query aufbauen,
jedoch ist hierbei zu beachten, das die gespeicherten Zeiträume jeweils über das Feld agid einen Angebot zugewiesen sind und das
die Überprüfung jeweils zu dem Angebot passen muß.
Deshalb denke ich, das meine Query logischweise erstmal mit
SELECT * FROM db01 WHERE agid = 'anbgebotid' beginnen muß.
Wie aber nun weiter ???
Gruss
Dieter
fast unabhängig davon was Du vorhast, die Kombination aus
Grundsätzlich ist das Forum - sofern Wir das richtig verstanden haben ;) - dafür geeignet bei der Problemlösung (des isolierten Problems ;) zu helfen oder konzeptionelle Fragen zu bearbeiten.
Hello,
Grundsätzlich ist das Forum - sofern Wir das richtig verstanden haben ;) - dafür geeignet bei der Problemlösung (des isolierten Problems ;) zu helfen oder konzeptionelle Fragen zu bearbeiten.
na ja, das Problem ist mittlerweile IMHO hinreichend isoliert. Die Frage lautet: Wie kann ich überprüfen, ob sich zwei Zeiträume überschneiden?
Zugegeben, das kann man am Besten erstmal mit Stift und Papier und etwas Überlegung lösen. Daher der Vorschlag an Dieter:
Überlege dir, wie eine Überschneidung aussehen kann!
Daraus baust du dann eine Menge OR-Vernüpfter BETWEEN-Anweisungen zusammen.
MfG
Rouven
Die Frage lautet: Wie kann ich überprüfen, ob sich zwei Zeiträume überschneiden?
Die untere Grenze des Zeitraums 1 mit der oberen Grenze von Zeitraum 2 vergleichen sowei die obere Grenze von Zeitraum 1 mit der unteren Grenze von Zeitraum 2, that's it.
Habe ich irgendwo einen Denkfehler ???
Nun, wenn Du ein "NULL-Ergebnis" bekommst und an der Sinnhaftigkeit Deiner WHERE-Bedingungen zweifelst, dann fragt sich old King^Lully doch, warum Du nicht selbst experimentell die Problematik dermassen eingrenzt, dass der Kern der Frage offenbar wird ODER sich die ursprüngliche Frage, der ursprüngliche Verdacht, ganz auflöst.
Hier liegt - wie eigentlich bei jeder fünften bis zehnten Frage eine fehlende bzw. mangelhafte
PROBLEMISOLIERUNG
vor. Ich rege an diesen Punkt in die FAQs des Forums an zentraler Stelle aufzunehmen!!
Hallo,
Hier liegt - wie eigentlich bei jeder fünften bis zehnten Frage eine fehlende bzw. mangelhafte
PROBLEMISOLIERUNG
vor.
Das Problem ist, das ich offensichtlich "den Wald vor lauter Bäumen nicht sehe". Eine gesonderte Problemisolierung ist mir derzeit nicht gegeben, da das Problem offensichtlich in meiner AND/OR-Anweisung zu suchen ist - ich diese aber mit meinen (bescheidenen) Fähigkeiten nicht weiter isolieren kann und ich deshalb um einen Denkanstoss in die richtige Richtung bitte.
Gruss
Dieter
Das Problem ist, das ich offensichtlich "den Wald vor lauter Bäumen nicht sehe". Eine gesonderte Problemisolierung ist mir derzeit nicht gegeben, da das Problem offensichtlich in meiner AND/OR-Anweisung zu suchen ist
Die Du aber systematisch aufbauen könntest bis diese Deiner Anforderung gerecht wird.
- ich diese aber mit meinen (bescheidenen) Fähigkeiten nicht weiter isolieren kann und ich deshalb um einen Denkanstoss in die richtige Richtung bitte.
Understatement, nichts gegen Understatement, aber glauben tun Wir das alles nicht. ;)
Kopf hoch, dem SELF-Gedanken ein wenig frönen und Du wirst nach Selbstauflösung bzw. optimaler Isolierung des Problems auch das Gefühl haben etwas geleistet zu haben. (Das möchten Wir an dieser Stelle auch allen Hartz IV-Empfängern zurufen und für die Überbrückungszeit die leckerne Kartoffelrezepte der Wikipedia empfehelen. ;)