mlaco
07.05.08,15:22
Zdravim!

Svoj problem mozem zjednodusit do nasledovneho prikladu:

Mam mnozinu otazok a mnozinu odpovedi. Ziskal som (join) mnozinu vsetkych otazok a prisluchajucich odpovedi.

A teraz potrebujem v SQL zistit, ci existuje na kazdu otazku jedinecna odpoved, alebo nie.

A toto neviem ako spravit - hoci s databazami sa uz hram uz dlho, s tymto som sa zatial nestretol...

Dakujem za help!
robin78
07.05.08,13:33
Predpokladam, ze mas tabulku Otazky a tabulku Odpovede. Tabulka Odpovede obsahuje cudzi kluc na Otazky.

Zaujima ta, ze ci existuje pre kazdy zaznam v tabulke otazky aspon jeden zaznam v tabulke Odpovede?

V akej forme chces vysledok? T.j. len odpoved true / false, alebo ako?
Flymaster
07.05.08,20:26
no zalezi na tom, ci mas tie odpovede ocislovane... teda, ci mas napr. dva stlpce v tabulke odpovedi, ak ano, viem ti pomoc takto, napr.

stlpce nech sa volaju: cislo, odpoved

pocet odpovedi na danu otazku zistis takto:

select distinct(cislo), count(cislo) as pocet_odpovedi
from tvoja_tabulka
order by 2 asc
group by cislo

tusim to takto nejako ma byt, ak si dobre pamatam... potom to treba zakomponovat do tvojho SQL ;)
sthruska
08.05.08,06:16
Keď chceš mať len jedinečné odpovede, tak by som doplnil Flymaster riešenie ešte o

WHERE count(cislo) = 1
mlaco
13.05.08,06:57
Keď chceš mať len jedinečné odpovede, tak by som doplnil Flymaster riešenie ešte o

WHERE count(cislo) = 1

Jedna otazka nemoze byt zodpovednana odpovedou, ktora bola uz pouzita na inu otazku. Pritom na niektore otazky pasuje viacero odpovedi, na inu menej, alebo ziadna. Potrebujem zistis ci je mozne "uspokojit" vsetky poziadavky.
No a problem je ze nemozem n-krat (pocet otazok) joinovat tabulku odpovedi, lebo je prilis velka (desattisice).
pawen
13.05.08,17:55
skus toto:
select aa.otazka, aa.odpoved from tabulka aa,
(select otazka, count(*) as pocet from tabulka group by otazka) bb,
(select odpoved, count(*) as pocet from tabulka group by odpoved) cc
where aa.otazka=bb.otazka and aa.odpoved=cc.odpoved and bb.pocet=1 and cc.pocet=1

alebo

select aa.otazka, aa.odpoved from tabulka aa
inner join (select otazka, count(*) as pocet from tabulka group by otazka) bb on
bb.otazka=aa.otazka and bb.pocet=1
inner join (select odpoved, count(*) as pocet from tabulka group by odpoved) cc on
cc.odpoved=aa.odpoved and cc.pocet=1
IT Solutions
16.05.08,18:38
Robin ma pravdu. Musis detailne specifikovat strukturu, funkcionalitu a pozadovany vystup. Lebo rieseni moze byt nespocetne vela, ale pokial neupresnis podstatu nebude ziadne to prave orechove...


1) Strukturu tabuliek (aspon podstatne stlpce, kluce, indexy a pod.)

2) Vyznam skriptu:
-ide len o overenie priradenia odpovede, alebo o zistenie ci je odpoved unikatna?
-kedy a ako chces overovat odpoved? uz pri dotaze query na db (cize by sa vratil vysledok len platnych zaznamov), alebo az pri praci s retazcom v php?
-takisto ako sa ma spravat skript ak dostane false odpoved. Pretypovat retazec, preskocit, zmazat a pod. Nezabudnut Group a Order a pod.

3) Ako chces spracovat vystup z databazy? Pri chybe prerusit skript, vypisat len chybove hlasenie, alebo oznacit chybne polia spravou, alebo len vysledky nepouzit? Ide o vypis alebo o kontrolu? Ukladat vysledky do premennej, alebo do poli, alebo len vypisat?

v prvom rade teda treba problem priblizit. Verim ze potom to nebude ziaden problem.
V kazdom pripade pokial sa jedna o aktivny result odporucam jednoduchy ale presny dotaz na db a okamzite spracovavanie do poli a cykly. Mam s tym lepsie skusenosti a vysledky ako s casovo narocnymy dotazmi, alebo neustalym hladanim vo vsetkych riadkoch...