WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 03.10.2008, 17:09   #1
RaistlinMajere
Inventar
 
Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343


Standard Suche SQL-Abfrage

hi,

ich hoffe ihr könnt mir bei dem folgenden problem helfen (sitze jetzt schon einige Stunden daran):

ich habe 3 tabellen: services, changeform und personen

ich möchte nun über changeform eine abfrage machen. dort sind u.a. IDs enthalten, die auf die anderen beiden tabellen verweisen (s_id bzw. p_id) und dort genau so heißen.
ich möchte nun bei meiner abfrage nicht nur einfach die einträge aus changeform haben, sondern anstatt der IDs die entsprechenden einträge aus den anderen beiden tabellen.

das wäre an und für sich nicht so schwierig über

Code:
SELECT
   CF.<alle spalten, die ich haben will>,
   S.s_name,
   P.p_name
FROM
   changeform CF,
   personen P,
   services S
WHERE
   CF.s_id=S.s_id
AND
   CF.p_id=P.p_id
;
das problem ist nur, daß der eintrag für p_id in changeform nur optional ist, defaultmäßig steht da 0 drin. ich möchte nun eine abfrage, die überprüft, ob da was anderes als 0 drinsteht und ggf., neben den anderen einträgen, anstatt der s_id den entsprechenden namen aus personen holt (dort existiert kein eintrag für s_id=0). falls 0 drin steht, kann das ruhig zurückgegeben werden, das bedeutet dann einfach "da steht nichts drin".

als ergebnis sollen alle einträge aus changeform ausgegeben werden mit den entsprechenden werten aus den anderen beiden tabellen anstatt der IDs sowie, falls p_id=0, genau das anstatt eines werts (den es ja nicht gibt, weil in personen kein eintrag dafür existiert) zurückgegeben wird.

wie müßte ein solches statement aussehen (DB ist MySQL)?
____________________________________
"Life is like a box of rockets," said the Marine. "You never know what you´re gonna ret."
Then he pulled the trigger of his BFG9000.
RaistlinMajere ist offline   Mit Zitat antworten
Alt 04.10.2008, 10:45   #2
pong
Inventar
 
Benutzerbild von pong
 
Registriert seit: 25.12.2000
Alter: 41
Beiträge: 9.063

Mein Computer

pong eine Nachricht über ICQ schicken
Standard

der Text ist schön und gut, aber ein kurzer Tabellenaufbau mit ein paar Beispielinhalten wäre aber um einiges einfacher, sowas zu lösen

btw. MySQL 5?

pong
____________________________________
\"Ein Gewitter reinigt die Luft\", sagte der Mann, nachdem ein Blitz seine Frau erschlug

Nicht klicken!


Erstposteralarm/Beschwerde/Kummerkasten


Verplattet
pong ist offline   Mit Zitat antworten
Alt 06.10.2008, 12:32   #3
RaistlinMajere
Inventar
 
Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343


Standard

Zitat:
Zitat von pong Beitrag anzeigen
der Text ist schön und gut, aber ein kurzer Tabellenaufbau mit ein paar Beispielinhalten wäre aber um einiges einfacher, sowas zu lösen
ich habe im text bewußt nur soviel von den tabellen beschrieben, wie notwendig ist, um das problem zu lösen.
in tabellenform wäre das:

tabelle changeform: ... | s_id | p_id | ...
tabelle services: s_id | s_name | ...
tabelle personen: p_id | p_name | ...

s_id und p_id in changeform beziehen sich wie gesagt auf die entsprechenden felder in services und personen, wobei entsprechend s_name und p_name extrahiert werden sollen.
das problem ist, daß in changeform bei p_id defaultmäßig 0 drinsteht (bedeutet, daß dem keine person zugewiesen wurde), es aber keine p_id=0 in personen gibt. entsprechend soll dann auch kein name ausgegeben werden (weil es keinen gibt), sondern z.b. eben der 0er (welcher dann bedeutet "keine Person zugewiesen").

ich hoffe jetzt ists etwas klarer.

Zitat:
btw. MySQL 5?
nein, 4.1.15
____________________________________
"Life is like a box of rockets," said the Marine. "You never know what you´re gonna ret."
Then he pulled the trigger of his BFG9000.
RaistlinMajere ist offline   Mit Zitat antworten
Alt 06.10.2008, 15:31   #4
pong
Inventar
 
Benutzerbild von pong
 
Registriert seit: 25.12.2000
Alter: 41
Beiträge: 9.063

Mein Computer

pong eine Nachricht über ICQ schicken
Standard

Nunja ohne Stored Procedures bleibt dir eh nichts anderes über als das in einem Programm abzuhandeln

select * from changeform a, services b where a.s_id = b.s_id;
select * from changeform a, personen c where a._pid = c.pid; da steht dann eh bei Notfound entweder der entsprechende sqlcode drinn oder es du fragst halt auf NULL ab

pong
____________________________________
\"Ein Gewitter reinigt die Luft\", sagte der Mann, nachdem ein Blitz seine Frau erschlug

Nicht klicken!


Erstposteralarm/Beschwerde/Kummerkasten


Verplattet
pong ist offline   Mit Zitat antworten
Alt 06.10.2008, 15:37   #5
iG0r
Gesperrt
 
Registriert seit: 14.08.2003
Alter: 47
Beiträge: 915


Standard

Flow Functions gibt es auch schon in mySQL 4.

http://dev.mysql.com/doc/refman/4.1/...functions.html
iG0r ist offline   Mit Zitat antworten
Alt 08.10.2008, 11:26   #6
RaistlinMajere
Inventar
 
Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343


Standard

danke vielmals für die hilfestellungen. ich habs jetzt über subselects sehr viel einfacher lösen können (ka warum mir das nicht vorher schon eingefallen ist):

Code:
SELECT
   CF.<alle spalten, die ich haben will>,
   (SELECT s_name FROM services WHERE s_id=CF.s_id),
   (SELECT p_name FROM personen WHERE p_id=CF.p_id),
FROM
   changeform CF
;
ob p_name dann NULL enthält oder nicht, frage ich später per code ab. natürlich wärs noch eleganter mit IFNULL gewesen

Code:
SELECT
   CF.<alle spalten, die ich haben will>,
   (SELECT s_name FROM services WHERE s_id=CF.s_id),
   IFNULL(
      (SELECT p_name FROM personen WHERE p_id=CF.p_id),
      'keine Person zugewiesen',
      (SELECT p_name FROM personen WHERE p_id=CF.p_id)
   )
FROM
   changeform CF
;
aber der returnwert eines subselects wird als parameter für IFNULL leider nicht akzeptiert.
____________________________________
"Life is like a box of rockets," said the Marine. "You never know what you´re gonna ret."
Then he pulled the trigger of his BFG9000.
RaistlinMajere ist offline   Mit Zitat antworten
Antwort


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

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.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:27 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag