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 07-08-2009, 12:49
starkeeper
 Registrierter Benutzer
Links : Onlinestatus : starkeeper ist offline
Registriert seit: Sep 2003
Beiträge: 1
starkeeper ist zur Zeit noch ein unbeschriebenes Blatt
Standard SQL - Kleinsten Wert ermitteln und update in spalte

Hallo,
ich habe ein Problem und komme nicht wirklich weiter.
Ich habe 5 Spalten
Spalte 1-3 sind leer oder beinhalten Werte
Spalte 4 soll den kleinsten Wert erhalten (mit update)
Spalte 5 soll den Namen der Spalte des kleinsten Wertes erhalten.

Ich habe folgendes versucht:

update `db`.`table` set `d` = a WHERE a < b AND a < c;
update `db`.`table` set `d` = b WHERE b < c AND b < a;
update `db`.`table` set `d` = c WHERE c < a AND c < b;
update `db`.`table` set `e` = 'a' WHERE a < b AND a < c;
update `db`.`table` set `e` = 'b' WHERE b < c AND b < a;
update `db`.`table` set `e` = 'c' WHERE c < a AND c < b;

Leider funktioniert das nicht wirklich sondern liefert nur Müll.

Ich bin über jede Hilfe dankbar - verzweifle gerade.

Gruß

Marco
Mit Zitat antworten
  #2 (permalink)  
Alt 09-08-2009, 16:55
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

<<Spalte 1-3 sind leer oder beinhalten Werte>>

ich gehe davon aus, dass leere Werte ==NULL sind
und NULL kann man nicht mit einem Zahl verglichen.

wenn du ein NULL als ein 0.0 haben willst, dann muss du die werte von den ersten 3 Zeilen so ansprechen:
IF(spaltenname is null,0,spaltenname)
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #3 (permalink)  
Alt 09-08-2009, 18:13
piratos
 Guest
piratos
Beiträge: n/a
Standard

Das mit dem Update einer Spalte mit dem kleinsten Wert kann man so machen:

Code:
update test set `d` = least(`a`,`b`,`c`)
Bleibt dann noch die Sache mit dem Spaltennamen
Mit Zitat antworten
  #4 (permalink)  
Alt 09-08-2009, 19:23
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von piratos Beitrag anzeigen
Das mit dem Update einer Spalte mit dem kleinsten Wert kann man so machen:

Code:
update test set `d` = least(`a`,`b`,`c`)
Bleibt dann noch die Sache mit dem Spaltennamen
least bringt nicht viel, da diese funktion auch bei NULL-werten scheitert.
least(100,null,-20) liefert leider ein NULL zurück und da wir sowieso die Spaltennamen brauchen, können wir nicht viel von Code sparen.
Also ohne if, bzw when mit der Abfrage von NULL-Werten kommt man da nicht weiter.
Code:
update `db`.`table` set `d` = a, `e` = 'a' 
WHERE if(a is null,0,a) <if(b is null,0,b) AND if(a is null,0,a) < if(c is null,0,c);
update `db`.`table` set `d` = b ,`e` = 'b' 
WHERE if(b is null,0,b) < if(c is null,0,c) AND if(b is null,0,b) < if(a is null,0,a);
update `db`.`table` set `d` = c,`e` = 'c' 
WHERE if(c is null,0,c) < if(a is null,0,a) AND if(c is null,0,c) < if(b is null,0,b);
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #5 (permalink)  
Alt 09-08-2009, 19:47
piratos
 Guest
piratos
Beiträge: n/a
Standard

Das bekommt man wenn man NULL in einem integer Wert setzen möchte:

Zitat:
Warning: #1366 Incorrect integer value: 'null' for column 'a' at row 1
Gespeichert wird 0 und nicht NULL.

Die Quizfrage ist natürlich, welchen Typ der Frage verwendet.

Verwendet man nun den Typ varchar und setzt gezielt einen Wert NULL

und hat nun so 2 Einträge

a b c
NULL 2 3
1 1 2

und testet das mal

SELECT least( `a` , `b` , `c` ) AS low
FROM test
WHERE 1

erhält man ein Ergebnis
low
2
1

was widerum beweist, das NULL nicht einbezogen ist und deine Annahme schlicht falsch ist, denn danach hätte man

low
NULL
1

erhalten müssen.
Mit Zitat antworten
  #6 (permalink)  
Alt 09-08-2009, 20:24
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

@piratos warum meinst du, dass er varchar benutzt?
die ergebnisse

low
NULL
1

sind 100% bei Integer-werten zu erwarten, also bei
least(NULL, 2, 3)
bekommst du ein glatte NULL

edit: jetzt habe ich sogar mit strings versucht
select least('1',null,'2');
Ergebnis NULL;

Wie hast du eine 2 in erster Zeile bekommen?
welche DB-Version hast du?
__________________
Slava
bituniverse.com

Geändert von Slava (09-08-2009 um 20:29 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 09-08-2009, 20:31
piratos
 Guest
piratos
Beiträge: n/a
Standard

Dein Gedankenfehler liegt darin das du zum Test

select least(NULL,1,2)

verwendest, das ergibt natürlich NULLl.

Der Frager checkt aber Tabellenfelder und da sieht es etwas anders aus.

Die von mir geposteten Ergebnisse sind wie man unschwer an der SQL erkennen kann Tabellenabfragen und die Ergebnisse sind so.

Man sollte also bei solchen Dingen immer einen echten Test vornehmen.

Server Version: 5.1.37

Geändert von piratos (09-08-2009 um 20:33 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 09-08-2009, 20:59
piratos
 Guest
piratos
Beiträge: n/a
Standard

Die Frage bleibt interessant:

Code:
CREATE TABLE IF NOT EXISTS `test` (
  `a` int(11) DEFAULT NULL,
  `b` varchar(11) NOT NULL,
  `c` varchar(11) NOT NULL,
  `d` varchar(11) NOT NULL,
  `e` varchar(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `test`
--

INSERT INTO `test` (`a`, `b`, `c`, `d`, `e`) VALUES
(0, '2', '3', '2', ''),
(1, '1', '2', '2', '0'),
(NULL, '4', '43', '', ''),
(NULL, '3', '1', '', '');
Da habe ich mal einen int mit DEFAULT Null angelegt.

Abfrage

SELECT least( `a` , `b` , `c` ) AS low
FROM test
WHERE 1

Ausgabe

low
0
1
NULL
NULL

Was aber auch korrekt ist den NULL ist nun mal der kleinste Wert.

Man sollte keinen DEFAULT NULL setzen, dann hat man damit auch kein Problem.
Lasse ich DEFAULT NULL verschwinden hat man

lo2
0
1
0
0

Was aber für mich praktisch das gleiche wäre.
Mit Zitat antworten
  #9 (permalink)  
Alt 09-08-2009, 21:31
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Was aber auch korrekt ist den NULL ist nun mal der kleinste Wert.
null kann nicht der kleinster wert sein, da ein null überhaupt kein wert ist.
schreib ein negativer wert in eine zeile wo null ist und deine least abfrage liefert immer noch null.

Dass die felder von defenition null waren, dass sieht man schon aus der aussage von Fragesteller als auch meinen Versuchen ihm zu helfen
Zitat:
Spalte 1-3 sind leer oder beinhalten Werte
wenn seine Tabelle keine NULL erlauben würde, dann hätte er mit seiner Abfrage keine Probleme gehabt, dann würde alles einwandfrei funktionieren.
__________________
Slava
bituniverse.com

Geändert von Slava (10-08-2009 um 14:54 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt 10-08-2009, 11:10
piratos
 Guest
piratos
Beiträge: n/a
Standard

Der Fragesteller hat nicht von NULL gesprochen , leider fehlt auch der Typ.

Wenn ich einen int definiere mit Default Null bekommt man keinerlei Inhalte gespeichert, wenn ich da eine NULL explizit einfügen will.
Tabelle kann zwar definiert werden, jedoch erzeugt der Versuch eine NULL zu speichern eine Warning: #1366 Incorrect integer value:

Die NULL kann man tatsächlich nur rein bekommen, wenn man beim Einfügen für das Feld keinen Wert vorgibt, so das der Default zum tragen kommt.

Davon abgesehen ist NULL der kleinste Wert, denn was kann kleiner sein als wenn nichts vorhanden ist und somit arbeitet least korrekt.

Ansonsten ist die Fragestellung wie man elegant den Feldnamen gleichzeitig heraus bekommt der wesentlich interessantere Teil der Frage.
Mit Zitat antworten
  #11 (permalink)  
Alt 10-08-2009, 12:15
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Wenn ich einen int definiere mit Default Null bekommt man keinerlei Inhalte gespeichert, wenn ich da eine NULL explizit einfügen will.
ich glaube, dass du eine gefährliche kombination " NOT NULL DEFAULT NULL " programmiert hast, sonnst sehe ich kein Grund, warum ein NULL nicht gespeichert sein kann.


Ich bitte weiterhin die Aussage, dass NULL der kleinster Wert ist zurückziehen, sonnst würde die query :select NULL<1; einen 1 liefern.
__________________
Slava
bituniverse.com

Geändert von Slava (10-08-2009 um 14:52 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 10-08-2009, 14:47
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

OffTopic:
@Slava: Bitte [quote]-Tags benutzen, wenn du zitierst, danke.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #13 (permalink)  
Alt 10-08-2009, 14:56
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

@wahsaga Ok.
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #14 (permalink)  
Alt 10-08-2009, 15:28
piratos
 Guest
piratos
Beiträge: n/a
Standard

Die Tabellenstruktur zum Test habe ich ja gepostet - lesen wäre gut.

Wenn ich da mal schlicht versuche einen leeren Datensatz einzufügen:

Zitat:
Warning: #1366 Incorrect integer value: '' for column 'a' at row 1
Warning: #1366 Incorrect integer value: '' for column 'c' at row 1
Warning: #1366 Incorrect integer value: '' for column 'd' at row 1
Warning: #1366 Incorrect integer value: '' for column 'e' at row 1
Mit Zitat antworten
  #15 (permalink)  
Alt 10-08-2009, 18:32
kuddeldaddeldu
 Registrierter Benutzer
Links : Onlinestatus : kuddeldaddeldu ist offline
Registriert seit: Sep 2006
Beiträge: 437
kuddeldaddeldu ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

Zitat:
Zitat von piratos
Wenn ich einen int definiere mit Default Null bekommt man keinerlei Inhalte gespeichert, wenn ich da eine NULL explizit einfügen will.
Tabelle kann zwar definiert werden, jedoch erzeugt der Versuch eine NULL zu speichern eine Warning: #1366 Incorrect integer value:

Die NULL kann man tatsächlich nur rein bekommen, wenn man beim Einfügen für das Feld keinen Wert vorgibt, so das der Default zum tragen kommt.
Nö, das explizite Eintragen von NULL (was, wie Slava schon sagt, kein Wert ist, sondern einfach nur bedeutet, dass die Spalte leer bleibt) in eine Integerspalte ist kein Problem, solange diese Spalte leer sein darf (kein NOT NULL).

Zitat:
Zitat von piratos
select least(NULL,1,2)

verwendest, das ergibt natürlich NULLl.

Der Frager checkt aber Tabellenfelder und da sieht es etwas anders aus.
Nein, das würden die MySQL-Entwickler denke ich auch weit von sich weisen. Der Funktion least() ist das vollkommen Schnuppe, ob die Werte aus einem Tabellenfeld kommen oder direkt notiert wurden. Wenn Du NULL,1,2 durch Spaltennamen ersetzt und ein anderes Ergebnis erhältst, haben die Spalten definitiv andere Inhalte, und wenn es nur ein leerer String oder 0 anstatt "kein Wert" ist.

Zitat:
Zitat von piratos
Der Fragesteller hat nicht von NULL gesprochen
Doch:

Zitat:
Zitat von starkeeper
Spalte 1-3 sind leer oder beinhalten Werte
Genau das bedeutet NULL.
Außerdem wäre der TS mit seinem Abfrageergebnis sonst nicht so unzufrieden (auch hier: s. Slava), logisch gesehen sind die ersten 3 UPDATE-Statements nichts anderes als Dein Vorschlag mit least().

Zitat:
Zitat von piratos
Die Tabellenstruktur zum Test habe ich ja gepostet - lesen wäre gut.

Wenn ich da mal schlicht versuche einen leeren Datensatz einzufügen:

Zitat:
Warning: #1366 Incorrect integer value: '' for column 'a' at row 1
Warning: #1366 Incorrect integer value: '' for column 'c' at row 1
Warning: #1366 Incorrect integer value: '' for column 'd' at row 1
Warning: #1366 Incorrect integer value: '' for column 'e' at row 1
Vielleicht solltest Du Deinen Post dann selbst nochmal lesen. Die einzige Tabellenstruktur, die Du gepostet hast, war hier. Und da setzt Du doch bei den INSERTs ganz munter NULL für Spalte a...

Deine Fehlermeldung deutet eher darauf hin, dass Du versuchst, einen leeren String einzufügen, bzw. hier den String 'null'.

Der Vollständigkeit halber:
@starkeeper: Warum willst Du denn überhaupt Informationen doppelt speichern? Das ist i.A. Käse.

LG
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
Wochentag Spalte durch UPDATE statement ermitteln elf7013 SQL / Datenbanken 3 21-04-2009 11:45
den kleinsten wert von den x - grössten Werten rausfinden KleinesOnlein29 SQL / Datenbanken 5 18-08-2006 08:26
GROUP BY und dann kleinsten Wert Spoony SQL / Datenbanken 2 18-04-2006 10:22
Den kleinsten Wert aus der Db lesen aber... SLSB02 SQL / Datenbanken 14 08-08-2005 15:38
array : kleinsten wert ermitteln cent PHP Developer Forum 5 31-01-2003 18:17

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 20:04 Uhr.