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 17-02-2009, 10:04
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard [SQL allgemein] Wenn kein DS, dann anderen DS ?

Hi,
kann ich in einer Query erreichen,
dass ich z.B. einen DS mit einer spezifischen id suche,
und falls dieser DS zwar vorhanden, aber keinen Inhalt besitzt (Leer),
dass dann ein anderer DS gelesen und ausgegeben wird?

Danke
Mit Zitat antworten
  #2 (permalink)  
Alt 17-02-2009, 10:16
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hier mein Beispiel:

PHP-Code:
SELECT        u_s.setting,
                                                
u_s.value
                                        FROM    user_setting u_s
,
                                                
user u
                                        WHERE    setting 
"alter"
                                        
AND     u.id '17'
                                        
AND        alteru_s.id 
Nun, wenn das Ergebnis Leer bleibt, weil in der Zelle des Datensatzen kein Wert verfügbar ist (NULL), dann soll eine andere Query ausgeführt werden, welche z.B. einen Datensatz ausließt.

Wie kann ich das mit einer IF realisieren?

(Sry für das besch..eidene Einrücken

Geändert von phpMorpheus2 (17-02-2009 um 10:18 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 17-02-2009, 11:15
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

PHP-Code:
<?php
$result 
mysql_query("SELECT bla FROM tabelle WHERE id = 5 AND bla IS NOT NULL");
if (
mysql_num_rows($result) == 0) {
  
$result mysql_query("SELECT blubb FROM tabelle2 WHERE id = 5");
}

if (
mysql_num_rows($result)) {
  
print_r(mysql_fetch_assoc());
}
Vielleicht solltest du aber mal deinen Anwendungsfall etwas genauer erläutern... irgendwie rieche ich nämlich förmlich, dass du irgendwas sehr merkwürdig modelliert hast.
Mit Zitat antworten
  #4 (permalink)  
Alt 17-02-2009, 11:18
goth
  Moderator
Links : Onlinestatus : goth ist offline
Registriert seit: Mar 2002
Ort: Erde
Beiträge: 7.271
goth ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Alternativen Datensatz via JOIN mit selektieren und dann IFNULL()

Code:
SELECT IFNULL(t1.value, t2.value)
  FROM table1
 INNER JOIN table2
    ON table1.cond = table2.cond
__________________
carpe noctem

Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht!
Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung!
Mit Zitat antworten
  #5 (permalink)  
Alt 17-02-2009, 11:21
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von ghostgambler
PHP-Code:
<?php
$result 
mysql_query("SELECT bla FROM tabelle WHERE id = 5 AND bla IS NOT NULL");
if (
mysql_num_rows($result) == 0) {
  
$result mysql_query("SELECT blubb FROM tabelle2 WHERE id = 5");
}

if (
mysql_num_rows($result)) {
  
print_r(mysql_fetch_assoc());
}
Vielleicht solltest du aber mal deinen Anwendungsfall etwas genauer erläutern... irgendwie rieche ich nämlich förmlich, dass du irgendwas sehr merkwürdig modelliert hast.
Nungut, es war nur ein Beispiel.
Ich möchte eben umgehen, zwei abfragen erstellen zu müssen.
z.B. eine Abfrage in der gefragt wird, ob die Abfrage erfolgreich war und falls nicht, eine andere query abfragen aber alles in einer SQL_Query
Mit Zitat antworten
  #6 (permalink)  
Alt 17-02-2009, 12:53
MelloPie
 PHP Master
Links : Onlinestatus : MelloPie ist offline
Registriert seit: Jan 2002
Ort: Hessen
Beiträge: 4.380
MelloPie ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Also man könnte natürlich sowas machen:

SELECT col
FROM table
WHERE id in($id,$alternative_id)
AND col is not null
LIMIT 1

Dann wird der Datensatz mit id=$id als erstes geprüft, der mit $alternative_id als nächstes
__________________
Beantworte nie Threads mit mehr als 15 followups...
Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25
Mit Zitat antworten
  #7 (permalink)  
Alt 17-02-2009, 14:10
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

PHP-Code:
SELECT col1col2col3
FROM Tbl
WHERE col1 
'1'
AND col2 'haus'
AND col3 manfred 
IST jedoch die Abfrage dann leer, trotz das alle Bedingungen erfüllt worden sind (Denn trotz erfüllten bedingungen KANN der Datensatz leer sein!) dann möchte ich in der selben Query die WHERE Bedingung ändern !

z.B. so:
PHP-Code:
SELECT col1col2col3
FROM Tbl
WHERE
IF(col1 '1'
AND col2 'haus'
AND col3 manfred) AS Bedingung1 NULL
THEN
col1 
'2'
AND col2 'boot'
AND col3 beate) AS Bedingung2
ELSE
//Bedingung1 bleibt als Ergebnis zurück, es sei denn,
//Bedingung1 ist Leer und dann ist Bedingung2 das Ergebnis 
Mit Zitat antworten
  #8 (permalink)  
Alt 17-02-2009, 15:44
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

Dann ändere deine WHERE-Bedingung so ab, dass nur etwas zurück geliefert wird, wenn auch der Wert in der Spalte der gewünschte Wert ist.

Ein anderer Weg zum Self-Join wäre noch
WHERE (bedingung1) OR (bedingung2) ORDER BY bedingung1 DESC
und dem würde ich prinzipiell auf den Vorzug gewähren... sieht zwar komisch aus, braucht dafür keinen JOIN.
Mit Zitat antworten
  #9 (permalink)  
Alt 17-02-2009, 17:49
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ja, jetzt habe ich es mit einer CASE auswahl hinbekommen.
Jedoch ein kleines Problem noch.
Und zwar bekomme ich als Ergebnis immer 2 Zellen.
Bei der ersten Auswahl werden beide gefüllt, bei der zweiten aber nicht.
Dort fehlt der Inhalt der ersten Zelle und ich weiß nicht wie ich diese füllen kann mit meinem Inhalt weil die Abfrage sich in der WHERE klausel befindet.

Das Alter wird zwar angezeigt, aber nicht die Zelle "Settings".
Diese Zelle wird nicht mit dem Wort "alter" gefüllt.

PHP-Code:
SELECT    u_s.setting,
                
u_s.value
FROM        user_setting u_s
,
                
user u
WHERE        
CASE WHEN
                u
.id 22
                
AND u.alter 0
THEN        
(u_s.setting "alter"
                
AND            u.id 22
                
AND            u.alter u_s.id)
ELSE        (
u.id 22
                
AND            u_s.id 0
                
AND            u.alter u_s.id)
END 
Mit Zitat antworten
  #10 (permalink)  
Alt 17-02-2009, 19:26
MelloPie
 PHP Master
Links : Onlinestatus : MelloPie ist offline
Registriert seit: Jan 2002
Ort: Hessen
Beiträge: 4.380
MelloPie ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ja weils im sql zugeordnet wird
THEN (u_s.setting = "alter"


was hat denn hieran:

SELECT col
FROM table
WHERE id in($id,$alternative_id)
AND col is not null
LIMIT 1

nicht funktioniert? Oder was war falsch verstanden?
__________________
Beantworte nie Threads mit mehr als 15 followups...
Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25
Mit Zitat antworten
  #11 (permalink)  
Alt 17-02-2009, 19:30
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

Tendenziell wäre es immer noch interessant den Anwendungsfall mal beschrieben zu kriegen.
Mir dünkt als wäre hier eine Normalform verletzt.
Das Problem kann man dann garantiert auch schöner lösen!

Geändert von ghostgambler (20-02-2009 um 13:31 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 20-02-2009, 08:39
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ok nähere Beschreibung:
Tabelle:
user
+--id--+--color--+--age--+
|--17--|----23----|---21---|


user_setting
+--id--+--setting--+--value--+
|---0---|---NULL----|----KA-----|
|---1---|----color---|----white--|
usw.

Nun, in der Tabelle "user" ist jeder einzelne DS ein user mit seinen Einstellungen.
Darunter fallen auch "Farbe, Alter" usw.

Wenn nun z.B. die gespeicherte Farbe von dem User mit der "id 17" rausgefunden werden soll, so lese ich die Zelle "color" vom user "17" aus.
Diese ID ist dann die ID von "user_setting" und deten value ist dann der entsprechende, gesuchte Wert.

Meine Anfänge:

PHP-Code:
SELECT        u_s.setting,
                                        
u_s.value
                                        FROM    user_setting u_s
,
                                        
user u
                                        WHERE
                                        
CASE WHEN    u.id 17
                                        
AND     u.color 0
                                        THEN    
(u_s.setting "color"
                                        
AND        u.id 17
                                        
AND        u.color u_s.id)
                                        ELSE    (
u.id 17
                                        
AND        u_s.id 0
                                        
AND        u.color u_s.id)
                                        
END 
Mit Zitat antworten
  #13 (permalink)  
Alt 20-02-2009, 08:50
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Boah ich habe mich total verrannt und den Wald vor lauter Bäumen nicht mehr gesehen.
Hab die Lösung

Danke
Mit Zitat antworten
  #14 (permalink)  
Alt 20-02-2009, 08:59
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nehmen wir aber einmal an,
ich habe folgenden Code:
PHP-Code:
SELECT        u_s.setting,
                                        
u_s.value
                                        FROM    user_setting u_s
,
                                        
user u
                                        WHERE    u
.id 17
                                        
AND        u.color u_s.id 
Aber "u_s.setting" beinhaltet KEINEN wert,
so hat die Ergebniszelle "setting" auch keinen Wert!
Jedoch soll in der Ergebniszelle "setting", auch bei keinem Wert "color" angezeigt werden. Denn "color" bzw. "u.color" wird in die SQL-Abfrage als Variable eingefügt.
Mit Zitat antworten
  #15 (permalink)  
Alt 20-02-2009, 09:07
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

Code:
SELECT		'color' AS setting,
u_s.value
FROM	user_setting u_s,
user u
WHERE	u.id = 17
AND		u.color = u_s.id
Es bietet sich übrigens an, JOINS auch als solche zu schreiben:
Code:
SELECT "color" AS setting, u_s.value
FROM user u
INNER JOIN user_setting u_s ON u.color = u_s.id
WHERE u.id = 17
Das erhöht die Übersichtlichkeit meist doch enorm.


Ansonsten könntest du noch so etwas machen:
Code:
SELECT us1.setting, COALESCE(us1.value, (SELECT value FROM user_setting WHERE id = 0))
FROM user u LEFT JOIN user_setting us1 ON u.color = us1.id
WHERE u.id = 17
Oder wenn man bei deiner alten Lösung bleiben möchte:
Code:
SELECT u_s.setting, u_s.value
FROM user_setting u_s, user u
WHERE u.id = 17 AND u.color = u_s.id
ORDER BY (u_s.setting = "color") DESC
LIMIT 1
(bei der Variante ist dann setting allerdings wieder leer, bei der mit COALESCE nicht.)
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 22:46 Uhr.