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 26-08-2007, 17:40
hdmnf
 Registrierter Benutzer
Links : Onlinestatus : hdmnf ist offline
Registriert seit: Jan 2007
Beiträge: 75
hdmnf ist zur Zeit noch ein unbeschriebenes Blatt
Standard Nachfolger & Vorgänger Element anzeiegen -> Fehler? (mehrere Datens.)

hallo

Ich möchte mit dieser Abfrage den Vorgänger Datensatz ermitteln, aber die Abfrage bringt mehrere Ergebnisse.

Abfrage im phpmyadmin ausgeführt:
SELECT contentnr from content where katnr = 1 and contentnr < 23

Ergebnis:
Zeige Datensätze 0 - 1 (2 insgesamt, die Abfrage dauerte 0.0003 sek.)
SQL-Befehl: SELECT contentnr
FROM content
WHERE katnr =1
AND contentnr & lt;

23


Ergebnis:
Ich bekomme zwei Datensätze mit der 12 und der 22 als contentnr angezeigt. Das sind genau die beiden Vorgänger, aber ich hätte hier nur den einen Datensatz mit der Nr. 22 haben wollen, weil das der Vorgänger zum 23er ist.





Die Abfrage zum Nachfolger funktioniert wunderbar, dass ist genau die gleiche wie die des Vorgängers nur das Größerzeichen umgedreht. (hier bekomme ich immer nur den dirket nachfolegenden angezeigt)


Was mache ich hier nur falsch??????????

Geändert von hdmnf (26-08-2007 um 18:01 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 26-08-2007, 18:07
awsdcom
 Newbie
Links : Onlinestatus : awsdcom ist offline
Registriert seit: Aug 2007
Beiträge: 5
awsdcom ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: Nachfolger & Vorgänger Element anzeiegen -> Fehler? (mehrere Datens.)

Zitat:
Original geschrieben von hdmnf
SELECT contentnr from content where katnr = 1 and contentnr < 23
SELECT contentnr
FROM content
WHERE katnr = 1
AND contentnr < 23
ORDER BY contentnr DESC
LIMIT 1

..versuch das mal!
__________________
Free php und perl scripte
Mit Zitat antworten
  #3 (permalink)  
Alt 26-08-2007, 18:12
hdmnf
 Registrierter Benutzer
Links : Onlinestatus : hdmnf ist offline
Registriert seit: Jan 2007
Beiträge: 75
hdmnf ist zur Zeit noch ein unbeschriebenes Blatt
Standard

funzt! KLASSE!!! VIELEN DANK!!!
Mit Zitat antworten
  #4 (permalink)  
Alt 27-08-2007, 12:35
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

na, was sagt mein Prof immer zum Maximum ermitteln durch sortieren? ^^
Performanter ist:
Code:
SELECT max( contentnr )
FROM content
WHERE katnr = 1
AND contentnr < 23
Mit Zitat antworten
  #5 (permalink)  
Alt 27-08-2007, 13:47
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Naja, dank Optimizer, sollte das eigentlich äquivalent performant sein - Nachteil bei MAX ist allerdings, dass man keine anderen Spalten selektieren kann, d.h. man müsste dann gleich wieder mit Sub-Query arbeiten und dass wiederum würde ich sagen ist definitiv langsamer in mysql~
Ansonsten würde ich aber auch zu der Max-Variante tendieren - ist kürzer~
Mit Zitat antworten
  #6 (permalink)  
Alt 27-08-2007, 19:13
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Naja, bei einer geringen Anzahl von Datensätzen wird der Aufwand kaum auseinander gehen, jedoch hat eine Sortierung den Aufwand O(n·log(n)), das Ermitteln des größten Elementes nur O(n).
Nimm 20.000 Datensätze:

Sortieren: ~80.000 (wenn man den log10 nimmt, normalerweise sogar log2, also noch höher)
Maximum: ~20.000

Mit Zitat antworten
  #7 (permalink)  
Alt 27-08-2007, 19:40
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich gehe davon aus, dass der Optimizer die beiden Queries, die beide sowieso nur auf dem Index laufen, gleich abarbeitet. (Kann mich natürlich auch irren - wäre ja nicht das erste Mal, dass der Optimizer nicht wirklich optimiert...)
Mit Zitat antworten
  #8 (permalink)  
Alt 27-08-2007, 20:45
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Das MAX(contentnr) allein wäre praktisch überhaupt kein Aufwand (O(c*Baumtiefe)), wenn contentnr Präfix eines Index ist.
Da aber die Where-Klausel zuerst erfüllt sein muß, wäre so ein Index nutzlos.

Also wenn diese Query wirklich nur über Indizes läuft, wie ghostgambler sagt, dann muß es entweder
a) zwei separate Indizes für katnr und contentnr geben oder
b) einen mehrwertigen Index (katnr.contentnr).

Der TO hat soweit ich sehe gar keine Angaben zu vorhandenen Indizes gemacht. Er sollte aber darüber nachdenken, denn PHP-Desaster könnte Recht haben.

Wenn a) oder b) erfüllt sind, kann bzw. sollte nicht optimiert werden.
Doch wenn keine geeigneten Indizes vorhanden sind, muß der Optimizer ran. Tja und ob der nun besonders pfiffig ist oder nicht, die Query hat nur einen Freiheitsgrad: die Kommutativität von AND.
Für eine Bewertung der beiden alternativen Auswertungsfolgen bräuchte der Optimizer Wissen über die Werteverteilung einzelner Attribute. AFAIK sammelt MySQL aber solche Daten nicht.

Fazit: Auf den Optimizer kommt es bei dieser Query nicht an. Der TO braucht die richtigen Indizes.


BTW: Ich bin mir nicht sicher, ob MySQL weiß, dass ORDER BY + LIMIT 1 das selbe ist wie MAX ... aber wahrscheinlich werden unterschiedliche Ausführungspläne für beide Queries erzeugt, weil eine Konvertierung in MAX() voraussetzt, dass bestimmte Randbedingungen erfüllt sind (Spalten im SELECT u.v.m.). Die Prüfung dieser Randbedingungen kann u.U. sehr aufwändig sein und wurde in MySQL schätzungsweise nicht implementiert.
Ist halt ein DBS für "einfache Queries" und "kleine Datenbestände", kein Bedarf für intensives Optimieren.

Geändert von onemorenerd (27-08-2007 um 20:52 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


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

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

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:38 Uhr.