WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Bitte um Hilfe bei SQL abfrage (http://www.wcm.at/forum/showthread.php?t=129454)

Nestrus 25.03.2004 15:57

Bitte um Hilfe bei SQL abfrage
 
Hallo,

ich arbeite an einem Teil eines Umfrageprogramms, das wir hier mit PHP und SQL (über en ADODB-wrapper, ich hab hier MySQL drauf) entwickeln.
Eigentlich war mein Teil schon fertig, allerdings wurde jetzt das Datenbankdesign etwas geändert, weshalb ich ein SQL neu schreiben muss. Nun komme ich einfach nicht darauf, wie ich dieses eine Qerry machen muss. *grummel*

Es geht dabei um folgende Tabellen:
Code:

CREATE TABLE poTAnswer (
  nAnswerNR int(11) NOT NULL auto_increment,
  nSortOrder float NOT NULL default '0',
  nQuestionNR int(11) NOT NULL default '0',
  nTypeNR int(11) NOT NULL default '0',
  nAnswer float default NULL,
  sAnswer varchar(250) NOT NULL default '',
  dCreate datetime NOT NULL default '0000-00-00 00:00:00',
  nUserNRCreator int(11) NOT NULL default '1',
  PRIMARY KEY  (nAnswerNR),
  UNIQUE nSortOrder(nQuestionNR,nSortOrder),
  FOREIGN KEY (nQuestionNR) REFERENCES poTQuestion ON DELETE CASCADE,
  FOREIGN KEY (nTypeNR) REFERENCES poTType,
  KEY nUserNRCreator (nUserNRCreator)
) TYPE=MyISAM AUTO_INCREMENT=1

/* RELATIONS FOR TABLE poTAnswer:
    nAnswerNRBefore
        poTAnswer -> nAnswerNR
    nQuestionNR
        poTQuestion -> nQuestionNR
    nTypeNR
        poTType -> nTypeNR
*/;

# --------------------------------------------------------

DROP TABLE IF EXISTS poTQuestion;
CREATE TABLE poTQuestion (
  nQuestionNR int(11) NOT NULL auto_increment,
  nPollNR int(11) NOT NULL default '0',
  nTypeNR int(11),
  nSortOrder float NOT NULL default '0',
  sName varchar(8),
  sQuestion text NOT NULL default '',
  dCreate datetime NOT NULL default '0000-00-00 00:00:00',
  nUserNRCreator int(11) NOT NULL default '1',
  nCategoryNR int(11) NULL default NULL,
  PRIMARY KEY  (nQuestionNR),
  FOREIGN KEY nPollNR (nPollNR) REFERENCES poTPoll,
  FOREIGN KEY (nCategoryNR) REFERENCES poTCategory,
  KEY nSortOrder (nPollNR,nSortOrder),
  KEY nUserNRCreator (nUserNRCreator)
) TYPE=MyISAM AUTO_INCREMENT=1

/* RELATIONS FOR TABLE poTQuestion:
    nPollNR
        poTPoll -> nPollNR
    nQuestionNRBefore
        poTQuestion -> nQuestionNR
*/;

# --------------------------------------------------------

CREATE TABLE poTUserAnswer (
  nUserAnswerNR int(11) NOT NULL auto_increment,
  nQuestionNR int(11) NOT NULL default '0',
  nCaseNR int(11) NOT NULL default '0',
  nAnswerNR int(11) default NULL,
  sAttribute text default NULL,
  nAttribute float default NULL,
  PRIMARY KEY  (nUserAnswerNR),
  FOREIGN KEY (nQuestionNR) REFERENCES poTQuestion,
  FOREIGN KEY (nCaseNR) REFERENCES poTCase,
  FOREIGN KEY (nAnswerNR) REFERENCES poTAnswer
) TYPE=MyISAM AUTO_INCREMENT=1 ;

/* RELATIONS FOR TABLE poTUserAnswer:
    nAnswerNR
        poTAnswer -> nAnswerNR
    nCaseNR
        poTCase -> nCaseNR
*/;

Ich brauche alle User Antworten nAttribute und sAttribute (aus poTUserAnswer), die zu einer Frage (nQuesionNR, aus poTQuestion) eines Fragebogens nPollNR gehören. Außerdem den Typ der Frage nTypeNR aus poTQuestion und (jetzt kommts *g*) die vorgefertigten Antworten sAnwer und nAnswer aus poTAnswer, wenn der user in potUserAnswer diese gwählt hat (nAnswerNR). Natürlich sollen aber trozdem auch die Datensätze aus potUserAnswer kommen, bei denen das Feld nAnswerNR NULL ist.

So, ich hoffe das war halbwegs verständlich.
Irgendwie hab ich das mit den anderen joins verlernt, und ich kann nur noch left inenr joins, da ich eigentlich fast immer nur diese brauch ;)


Viel, vielen Dank schon mal für alle, die sich den Text bis hier her durchgeschaut haben und mir evtl. Helfen können.
Nestrus

Biri 29.03.2004 00:34

hi !

kannst eine access db, welche die tabellen und die beziehungen dieser beinhaltet anhängen ?
im idealfall mit ein paar daten und dem gewünschten abfrageergebnis als .txt Datei anbei - dann ist die aufgabenstellung klar.
(sorry - hab keine lust, um die zeit noch tabellen zu erstellen)

werd mir das dann morgen anschauen (wenn zeit).

fg
-hannes

Nestrus 29.03.2004 00:55

Hallo Biri,


danke für die Antwort, ich hätt gar nicht gedacht, dass hier jemand antwortet (und noch weniger dass es je jemand versteht) was wohl daran liegt, dass ich diesen thread schon fast vergessen hätte.

Naja, wie eigentlich immer hab ich mal wider viel zu kompliziert gedacht. (Deshalb wolle ich auch euch fragen, damit mir jemand sagt, dass es hier noch einen einfachen Weg geben würde, den ich nicht sehe.)
Ich hab das Problem eigentlich noch am selben Tag, als ich das gepostet habe gelöst, wen's interresiert:

Code:

SELECT Q.nTypeNR AS QnTypeNR, UA.sAttribute AS UAsAttribute, UA.nAttribute AS UAnAttribute, A.sAnswer as AsAnswer, A.nAnswer as AnAnswer
        FROM poTQuestion Q, poTUserAnswer UA, poTAnswer A
        WHERE UA.nQuestionNR = Q.nQuestionNR AND
        A.nAnswerNR = UA.nAnswerNR AND
        Q.nPollNR = ".$attributes['polls']."AND
        Q.nTypeNR != 8
        ORDER BY UA.nCaseNR;

(Wer sich wundert, warum ich für jedes Feld einen alias vergebe: Es geht mit ADODB nicht anders und ich hab den wrapper nicht ausgesucht...)

Nochmals danke für deine angebotene Hilfe und entschuldigung dass ich nicht geschrieben hab dass das Problem schon wieder hinfällig ist.

Gruß
Nestrus

Biri 30.03.2004 19:25

hi !

na ist ja kein problem. :)

ich verwend meisten access zum abfrage bauen (als echtes DBS ists eher nix) - aber das was man will kann man so grob mit dem assistenten machen - den feinschliff dann mit reinem sql.

außerdem kann man das ergebnis schnell kontrollieren.

ad adodb: hab das bei einem php + sql-server-db projekt verwendet. finds nicht schlecht - ist aber nun schon länger her und es gibt inzwischen sicher eine neuere version davon.

fg
-hannes

Nestrus 30.03.2004 19:50

Access will ich eigentlich nicht installieren, zumal ich nicht dauernd unter win arbeite...

Zitat:

Original geschrieben von Biri
ad adodb: hab das bei einem php + sql-server-db projekt verwendet. finds nicht schlecht - ist aber nun schon länger her und es gibt inzwischen sicher eine neuere version davon.
Naja, es war nicht meine Entscheidung, aber ich glaube auch dass es Vorteile hat, die die paar Einschränkungen wieder wett machen. (zB ist es sehr frein zu den Ergebnisen zu kommen: eine while-Schleife an deren Ende einfach das Ergebnisarray um eine Stelle weiter versetzt wird)


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:19 Uhr.

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