Antworten auf deine Fragen:
Neues Thema erstellen

Probelm mit Null-Wert in SQL-Abfrage

Kerstin77

Flashfan

Hallo,

sorry aber hab schon wieder ein Problem mit einer SQL-Abfrage. Sie funktioniert eigentlich schon so, wie ich es haben möchte. Die Ergebnistabelle sieht bisher so aus (es wird für jedes Projekt und jeden Benutzer ausgelesen, ob der Benutzer an dem Projekt teilnimmt):

PHP:
projektname     semester     betreuer           teilnahme
-----------     --------     --------           ---------
ab              WS 09/10     Name, Vorname      ja
xy              WS 09/10     Name, Vorname      NULL
Jetzt möchte ich aber unter der Spalte teilnahme kein NULL stehen haben, sondern ein nein. So geht es leider nicht:

PHP:
SELECT projektname, semester, concat(name, ', ', vorname ) AS betreuer, (
    SELECT if( projekt_teilnehmer.id IS NULL , 'nein', 'ja' ) 
    FROM projekt_teilnehmer
    WHERE projekt_teilnehmer.benutzer_id = $benutzer_id
    AND projekt_teilnehmer.projekt_id = projekte.id_projekt
) AS teilnahme
FROM projekte, benutzer
WHERE projekte.betreuer_id = benutzer.id_benutzer
ORDER BY teilnahme ASC, projektname ASC
Komischerweise erkennt er doch auch, wenn der Wert nicht NULL ist und schreibt das "ja" rein. Warum also kein "nein" bei NULL? Wie geht es richtig?

Kerstin
 

saila

Moderatorle

AW: Probelm mit Null-Wert in SQL-Abfrage

Hi,

hast du schon IF NOT NULL 'ja','nein' versucht?
Ansonsten ginge auch noch IFNULL() - so auf die Schnelle aus dem Ärmel geschossen :)
 

Kerstin77

Flashfan

AW: Probelm mit Null-Wert in SQL-Abfrage

Hi,

kommt auf's selbe raus: "ja" steht drin, "nein" nicht...

EDIT: ifnull?
Hm, da bekomme ich doch entweder einen numerischen Wert oder einen String. Habe aber 2 Strings die ich ausgeben möchte. Also entweder ja oder nein.
 
Zuletzt bearbeitet:

saila

Moderatorle

AW: Probelm mit Null-Wert in SQL-Abfrage

Ist das Feld überhaupt gefüllt oder 0 was nicht NULL entspricht ;) ?

Ansonsten würde ich keine NULL zuweisen, sondern die Felder mit 0 und 1 füllen. Sprich ja = 1 und nein = 0. Dann wäre die Abfrage mit IF(feld > 0, 'ja','nein')
 
Zuletzt bearbeitet:

Schnuffy12

Noch nicht viel geschrieben

AW: Probelm mit Null-Wert in SQL-Abfrage

EDIT: ifnull?
Hm, da bekomme ich doch entweder einen numerischen Wert oder einen String. Habe aber 2 Strings die ich ausgeben möchte. Also entweder ja oder nein.
Entweder kommt der Wert des Feldes raus oder halt der Alternativwert. IFNULL(projekt_teilnehmer.id, 'nein') gibt dir die ID (wenn nicht NULL) sonst 'nein'.

Da du 'ja' haben möchtest probier mal:
CASE WHEN projekt_teilnehmer.id IS NULL THEN 'nein' ELSE 'ja'
 

Kerstin77

Flashfan

AW: Probelm mit Null-Wert in SQL-Abfrage

Das ergibt NULL bzw. die ID...

Hab's jetzt aber über die Ausgabe gelöst:

PHP:
$ausgabe = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><data><eigene_projekte>";

// Projekte ausgeben
$i=0;
$tn = mysql_result($ergebnis, 0,3);
while ($zeile = mysql_fetch_object($ergebnis)) {
   if ($zeile->teilnahme == $tn) {
      $i++;
   } else {
      $ausgabe .= "</eigene_projekte><andere_projekte>";
      $tn = $zeile->teilnahme;
      $i=0;
   }
   $ausgabe .= "<ds id=\"".$i."\" ProjektID=\"".$zeile->id_projekt."\" Projektname=\"".$zeile->projektname."\" Betreuer=\"".$zeile->betreuer."\" Semester=\"".$zeile->semester."\" />";
}
$ausgabe .= "</andere_projekte></data>";
echo $ausgabe;

Wenn jemand noch einen Tip hat, nur her damit ;)
 
Zuletzt bearbeitet:

saila

Moderatorle

AW: Probelm mit Null-Wert in SQL-Abfrage

Hi,

so nun noch mal mit freiem Kopf nach dem Radeln :)

Also ich hab mir deinen Query genauer angesehen und im Grunde ist dieser nicht korrekt aufgebaut. Dein Subselect kannst du im Grunde mit einem LEFT JOIN klären und innerhalb des SELECT fragst du wie folgt:
Code:
if([COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB]projekt_teilnehmer[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]id[/COLOR][/COLOR], 'ja','nein) as T

Allerdings ist hier erforderlich, dass auch eine Tabelle und Feld "projekt_teilnehmer.id" existiert.

Zudem gehe ich nach wie vor davon aus, dass du den Unterschied von NULL und 0 noch nicht verinnerlicht hast.

Was mich nur noch stutzig macht bei der Abfrage ist, dass der Query mit einem IF - Statement schneller ist, als würde die Tabelle einfach mit z.B.
Code:
select * from table

Aber das muss dich ja nun nicht beschäftigen :)
 

Kerstin77

Flashfan

AW: Probelm mit Null-Wert in SQL-Abfrage

Zudem gehe ich nach wie vor davon aus, dass du den Unterschied von NULL und 0 noch nicht verinnerlicht hast.

Doch, den kenne ich auf jeden Fall.

Allerdings ist hier erforderlich, dass auch eine Tabelle und Feld "projekt_teilnehmer.id" existiert.

Das tut es. Die 3 Tabellen haben folgenden Aufbau:

PHP:
projekte        projekt_teilnehmer     benutzer
-----------     ------------------     -----------
id_projekt      id                     id_benutzer
projektname     benutzer_id            name
betreuer_id     projekt_id             vorname
semester
Ausgehend von einer BenutzerID (Variable $benutzer_id) sollen jetzt alle vorhandenen Projekte mit Betreuer und Semester ausgegeben werden und zusätzlich das Ja/Nein-Feld, ob der Benutzer mit der ID $benutzer_id an dem Projekt teilnimmt.

Es ist zum heulen, aber es will nicht klappen :'(

Kerstin


So, nun ist es wirklich erledigt. Danke an alle für die Geduld ;-)
 
Zuletzt bearbeitet:

saila

Moderatorle

AW: Probelm mit Null-Wert in SQL-Abfrage

Hi,

wenn es immer noch nicht klappt, hier:

PHP:
<?php
SELECT
  b.bid, concat(ln, ' ',fn) as betreuer,
  tp.*,
  pt.*,
  if(pt.projekt_id, 'ja', 'nein') AS teilnahme
FROM
  benutzer AS b
  LEFT JOIN t_projekt AS tp ON (tp.betreuer_id = b.bid)
  LEFT JOIN projekt_teiln AS pt ON (pt.id = tp.id_projekt)
WHERE
  b.bid = 1
ORDER BY
  teilnahme;

?>
Also da du schon normalisiert hast, solltest du gleich noch Fremdschlüssel mit einbinden - so als Vorschlag.

Obiger Query hat nun ja oder nein als Ausgabe bei Teilnahme ;) Musst also nur noch auf deine Bedürfnisse anpassen.
 

Kerstin77

Flashfan

AW: Probelm mit Null-Wert in SQL-Abfrage

Hi,

danke für die weitere Antwort, aber hatte vorhin ja schon geschrieben, daß es läuft. Nur ohne Subquery hab ich es nicht hinbekommen. Hier meine Lösung:

PHP:
SELECT projekte.projektname, CONCAT( benutzer.name,  ', ', benutzer.vorname )  AS betreuer, 
if( projekte.id_projekt IN (      
   SELECT  DISTINCT projekte.id_projekt
   FROM projekte
   LEFT  JOIN projekt_teilnehmer ON projekte.id_projekt = projekt_teilnehmer.projekt_id
   LEFT  JOIN benutzer ON projekte.betreuer_id = benutzer.id_benutzer
   WHERE projekt_teilnehmer.benutzer_id =4
   OR projekte.betreuer_id =4   ),  'ja',  'nein'  )  AS teilnahme
FROM ausleihe.benutzer
INNER  JOIN ausleihe.projekte ON benutzer.id_benutzer = projekte.betreuer_id
ORDER  BY teilnahme ASC , projektname ASC
Kerstin
 

saila

Moderatorle

AW: Probelm mit Null-Wert in SQL-Abfrage

Naja, nun hast du noch die Wahl, welcher Query für die Performance besser ist :) Aber man brauch auf jeden Fall keinen Subselect ;)
 

Kerstin77

Flashfan

AW: Probelm mit Null-Wert in SQL-Abfrage

Ja, wahrscheinlich ist die Performance ohne Subquery besser. Aber wenn ich 15 Projekte habe, und durch die Abfrage beispielsweise mal 9 und mal 17 Ergebniszeilen bekomme (je nachdem, welche BenutzerID ich eingebe), dann weiß ich, daß da irgendwas nicht passen kann. So war es zumindest bei meinen Versuchen ohne Subquery. Deinen Vorschlag habe ich heute früh auch noch mal getestet, leider mit dem gleichen falschen Ergebnis.

Jetzt gehe ich da nicht mehr bei, bin nur froh, daß es überhaupt korrekt funktioniert. SQL ist nicht meine Welt...

Trotzdem vielen Dank für die Geduld ;-)

Kerstin
 

saila

Moderatorle

AW: Probelm mit Null-Wert in SQL-Abfrage

Das würde mich nun schon interessieren. Kannst du mir mal dein Tabellenlayout/struktur mit den Inhalten senden (per PM). Dann kann ich das mal testen.
Hintergrund - man hat ja nicht jeden Tag mit IF in Query-Statements zu tun und mit Subselects sollte man eigentl. nicht arbeiten. Auch wenn z.B. MySql selbst dies in Schulungen (in welchen ich noch nicht war) so erzählt. Hier wiederum der Hintergrund - frisst zu viel Performance - so meine Erfahrung. Das ist zwar alles auf den kleinen Rahmen bezogen noch in Ordnung. Aber alles was mal klein ist, wächst ab und an und dann ist das für den Nutzer nicht mehr mit viel Freude verbunden, wenn dieser dann 20 Sekunden auf die Ergebnisse warten muss :)

Edit:
Hier noch der korrekte Query für alle:
Code:
SELECT
  DISTINCT p.id_projekt,
  p.projektname AS PN,
  b.benutzername AS B,
  IF(pt.benutzer_id, 'ja','nein') AS teilnahme
FROM
  projekte p
  LEFT JOIN benutzer AS b ON (b.id_benutzer = p.betreuer_id)
  LEFT JOIN projekt_teilnehmer AS pt ON (pt.projekt_id = p.id_projekt)
ORDER BY
  teilnahme,
  projektname;
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.614
Beiträge
1.538.351
Mitglieder
67.525
Neuestes Mitglied
mgtaucher
Oben