WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Suche SQL-Abfrage (http://www.wcm.at/forum/showthread.php?t=230989)

RaistlinMajere 03.10.2008 17:09

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)?

pong 04.10.2008 10:45

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

RaistlinMajere 06.10.2008 12:32

Zitat:

Zitat von pong (Beitrag 2314731)
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

pong 06.10.2008 15:31

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

iG0r 06.10.2008 15:37

Flow Functions gibt es auch schon in mySQL 4.

http://dev.mysql.com/doc/refman/4.1/...functions.html

RaistlinMajere 08.10.2008 11:26

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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:21 Uhr.

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