php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 19-11-2015, 14:37
andyB
 Registrierter Benutzer
Links : Onlinestatus : andyB ist offline
Registriert seit: Apr 2005
Ort: Hamburg, Germany
Beiträge: 27
andyB ist zur Zeit noch ein unbeschriebenes Blatt
Cool <= (kleiner gleich) in WHERE funktioniert nicht (richtig)?

Hallo,

ich habe da ein winziges Problem mit einem Teil einer MySQL-Abfrage, welcher nicht so funktioniert, wie ich es erwarte.

Tabelle:
Code:
mysql> DESCRIBE product_price;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| product_id | int(10) unsigned | NO   |     | NULL    |                |
| start_date | date             | NO   |     | NULL    |                |
| price      | decimal(5,2)     | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

mysql> SELECT * FROM product_price;
+----+------------+------------+--------+
| id | product_id | start_date | price  |
+----+------------+------------+--------+
|  1 |          1 | 2015-01-01 |  12.50 |
|  2 |          2 | 2015-01-01 |   9.80 |
|  3 |          3 | 2015-01-01 | 135.95 |
|  4 |          1 | 2015-03-01 |  17.80 |
|  5 |          3 | 2015-05-01 | 150.00 |
|  6 |          4 | 2015-05-01 |  75.39 |
+----+------------+------------+--------+
Abfrage 1:
Code:
mysql> SELECT * FROM `product_price` WHERE `product_id`=1 AND `start_date`<='2015-02-01' LIMIT 1;
+----+------------+------------+-------+
| id | product_id | start_date | price |
+----+------------+------------+-------+
|  1 |          1 | 2015-01-01 | 12.50 |
+----+------------+------------+-------+
1 row in set (0.00 sec)
Ergebnis 12.50 ist richtig.

Abfrage 2:
Code:
mysql> SELECT * FROM `product_price` WHERE `product_id`=1 AND `start_date`<='2015-03-01' LIMIT 1;
+----+------------+------------+-------+
| id | product_id | start_date | price |
+----+------------+------------+-------+
|  1 |          1 | 2015-01-01 | 12.50 |
+----+------------+------------+-------+
1 row in set (0.00 sec)
Ergebnis 12.50 ist falsch, sollte 17.80 sein. Und `start_date` sollte 2015-03-01 sein.

Habe ich da einen Denkfehler? Oder gibt es eine Besonderheit bei MySQL die ich nicht kenne?

Bin dankbar für Hinweise...

Gruß
andyB.
Mit Zitat antworten
  #2 (permalink)  
Alt 19-11-2015, 15:22
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

2015-01-01 ist kleiner als 2015-03-01. Und demzufolge ist das Ergebnis deiner Abfrage vollkommen korrekt.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #3 (permalink)  
Alt 19-11-2015, 15:28
andyB
 Registrierter Benutzer
Links : Onlinestatus : andyB ist offline
Registriert seit: Apr 2005
Ort: Hamburg, Germany
Beiträge: 27
andyB ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wenn ich jetzt das Datum in der WEHRE-Klausel auf 2015-03-05 setzte gibt er mir aber auch den Datensatz mit dem Datum 2015-01-01 zurück.

Liegt das am LIMIT 1?

Wenn ich das weg lasse, bekomme ich beide Datensätze zurück.

Gibt es eine Methode, wie ich die Anzahl der Datensätze einschränke?
Im Beispiel sind ja 'nur' zwei Datensätze vorhanden. In Wirklichkeit aber viel mehr.
Mit Zitat antworten
  #4 (permalink)  
Alt 19-11-2015, 15:46
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Du selektierst erst mal alle Datensätze mit Datum kleiner-gleich, und lässt dir von der Datenbank dann den „ersten“ davon zurückgeben – und welcher dieser „erste“ ist, ist mehr oder weniger Zufall, weil du der Datenbank keine Anweisung gegeben hast, die Datensätze zunächst nach irgendeinem Kriterium zu sortieren, bevor der erste davon genommen wird.

Also: Zusätzlich die gewünschte Sortiung angeben.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #5 (permalink)  
Alt 19-11-2015, 16:03
andyB
 Registrierter Benutzer
Links : Onlinestatus : andyB ist offline
Registriert seit: Apr 2005
Ort: Hamburg, Germany
Beiträge: 27
andyB ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Du meinst also, dass:
Code:
mysql> SELECT * FROM `product_price` WHERE `product_id`=1 AND `start_date`<='2015-03-01' ORDER BY `start_date` DESC LIMIT 1;
das Problem löst?

Ich probiere das später mal aus.

Geändert von goth (20-11-2015 um 19:04 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 21-11-2015, 00:14
andyB
 Registrierter Benutzer
Links : Onlinestatus : andyB ist offline
Registriert seit: Apr 2005
Ort: Hamburg, Germany
Beiträge: 27
andyB ist zur Zeit noch ein unbeschriebenes Blatt
Red face

Das ist tatsächlich die Lösung.
Irgendwie stand ich auf'm Schlauch...

wahsaga!
Mit Zitat antworten
  #7 (permalink)  
Alt 03-01-2017, 18:21
thomaswerner
 Registrierter Benutzer
Links : Onlinestatus : thomaswerner ist offline
Registriert seit: Jan 2017
Beiträge: 3
thomaswerner befindet sich auf einem aufstrebenden Ast
Standard

Die Lösung mit ORDER BY mit LIMIT ist aber ganz schön "teuer".

Nehmen wir mal an die Tabelle hat 5 Mio. Datensätze, wovon 1 Mio <= 2015-03-01 sind. Bei deiner Abfrage muss die DB aber erst 1 Mio Datensätze ermitteln und sortieren um später nur einen Datensatz der Middleware PHP zu übergeben.

Mag sein das 1 Mio übertrieben ist, aber wächst die Datenbank, viele Tabellen und Joins, kann bei einem "kartesischen Produkt" schon bei wenigen 1000 Datensätzen dieser Flaschenhals auftreten. Zu Beginn beim Programmieren mit wenigen Daten wird man nichts merken, aber wenn es Live geht, fangen die Performance Probleme an.

Lieber weiter mit WHERE arbeiten (bspw. Timeframe) statt nur auf ORDER BY und LIMIT zu setzen. Auch wenn es tut, ich finde die WHERE Condition alleine mit <= 2015-03-01 ist ganz schön dürftig.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
kleiner gleich devas SQL / Datenbanken 4 16-05-2007 18:38
WHERE funktioniert nicht? laborfutzie SQL / Datenbanken 2 02-08-2006 00:44
Kleiner gleich 0 - Frage FRAD PHP Developer Forum 11 20-07-2005 14:17
WHERE Abfrage funktioniert nicht so richtig :( OliOli SQL / Datenbanken 6 28-06-2005 16:57
[JavaScript] Opera ladet das Menu nicht gleich richtig BenC HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 0 14-08-2003 13:22

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

zechat ansehen zechat

Willst du Chat-Admin in deinem eigenen kostenlosen Chat mit vielen Funktionen sein, und soll der Chat dazu noch schnell und stabil auf alles Webservern sein? Wenn ja, ist deine Suche jetzt vorbei!

07.06.2018 Manuel1986 | Kategorie: AJAX/ Chat
bootstrapzero

kostenlose Bootstrap-Themes

05.06.2018 Berni | Kategorie: HTML5/ CSS-Responsive
Entwicklung einer Chat-Webanwendung mit Node.js

Einfacher Chat mit Node.js

26.05.2018 Berni | Kategorie: Node.js/ nodejs-Tutorials
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:09 Uhr.