Neo1010
.
|
Hello!
So brauch wieder mal ein Select. Folgender Tabellenaufbau:
CREATE TABLE `operation` ( `job_id` int(11) NOT NULL default '0', `operation_id` int(11) NOT NULL auto_increment, `description` varchar(128) collate utf8_unicode_ci default NULL, `state` varchar(32) collate utf8_unicode_ci default 'offen' )
state von der operation table kann sein "erledigt" oder "offen"
So ich bräucht nun ein select, welches mir liefert "erledigt" wenn alle operations zu einer job_id auf "erledigt" gesetzt sind ansonsten soll es "offen" liefern
Hoffe ich hab das so verständlich erklärt.
zb:
Job Nr1 hat Operation Nr1 und Operation Nr2 Beide Operation haben beim state = "erledigt" also sollte die Abfrage für JobNr1 "erledigt" ergeben
oder
Job Nr1 hat Operation Nr1 und Operation Nr2 Operation Nr1 hat beim state = "erledigt" und Operation Nr2 hat state="offen" also sollte die Abfrage für JobNr1 "offen" ergeben da noch nicht alle Operations innerhalb des Jobs erledigt sind
mfg Neo1010
Bearbeitet von Neo1010 am 03.02.2009, 22:13
|
DKCH
Administrator ...
|
schnellschuss aus der hüfte: select count(*) from operations where job_id=x and state=<guid für offen>, wenn != 0 gibts offene...
edit: natürlich schlecht wenns viele operations pro job gibt, die dann alle durchlaufen werden müssen, select 'offen' from operations a where a.job_id=x and exists (select * from operations b where b.job_id=a.job_id and b.state=<guid für offen> wär vielleicht gscheiter
|
PuhBär
Schau ned so genau
|
Hmm, wenn der state ein int sein könnte (weiss nicht ob du da Einfluss drauf hast) dann würd ichs so machen:
state 0 = offen state 1 = erledigt
select job_id, min(state) from operation group by job_id having min(state) >0
Edit: Aso, seh grad du willst alle jobs sehen und nur ob schon erledigt oder nicht.
Dann würd ich
select job_id, min(state), case min(state) when 0 then 'offen' else 'erledigt' end as statetxt from operation group by job_id
Hoffe das case geht min aggregatfunktionen, weiss ich jetzt nicht auswendig ...
Bearbeitet von PuhBär am 02.02.2009, 00:09
|
prayerslayer
Oar. Mh.
|
leicht OT, aber ist das überhaupt normalformkonform, wenn das attribut state da ein varchar ist und kein foreign key auf eine state-tabelle? //danke an tinker, der meine posts noch mal so zusammenfasst, dass auch andre leute sie verstehen
Bearbeitet von prayerslayer am 02.02.2009, 12:04
|
tinker
SQUEAK
|
Obs jetzt was mit der Normalform zu tun hat, da bin ich mir nicht ganz sicher. Auf jeden Fall is es aber ungünstig. Denn sobald jemand hergeht und dann 'erlädigt' oder 'ofen' einträgt, tut man sich bei der Auswertung schwer.
|
Crash Override
BOfH
|
Sowas sollte man als booĺ machen. Dann wäre auch sichere summenabfrage möglich.
|
tinker
SQUEAK
|
Boolean geht auch. Aber in einer extra state-tabelle könnt man noch verschiedene sprachen unterbringen, also zb: ID | GER | ENG
1 | Offen | Open
2 | Erledigt | Done
Außerdem wird das ganze dann etwas in die DB ausgelagert. Weil ich einfach ein SELECT GER FROM STATE mach, und nicht ein if in der Anwendung ala if (state == true)
text = "offen";
else text = "erledigt";
Was halt vor allem bei mehreren Sprachen sinnvoll is, kommt dann halt drauf an. @prayerslayer: Aber der Threadersteller sollt deine Ausführung auch verstehen, wollts nur nochmal bestätigen, auch wenn ich, wie gesagt, nicht genau weiß, obs jetzt mit der Normalform zu tun hat.
|
fatmike182
Agnotologe
|
wenn das durch ein Formular passiert und dann $_POST['checkboxname'] übermittelt wird soll das mit "erledigt" kein Problem sein imho. Kannst ja einen default Wert mitgeben (im sql)
|
prayerslayer
Oar. Mh.
|
boolean geht halt nur, wenn es nicht mehr als 2 stati gibt, was imho nicht immer so sein muss. und @fatmike: wenn es automatisiert eingetragen wird, sollte es kein problem sein, das ist klar, aber man weiß ja nicht, was der threadersteller vorhat ![:)](/images/smilies/smile.gif) und wenn ich dran zurückdenk, wie wir in der htl tabellen in 3. nf gebracht haben, sollte es schon etwas damit zu tun haben ![:)](/images/smilies/smile.gif) sicher weiß ichs halt auch nicht
|
SilentBob
Little Overclocker
|
falls auf 'offen' und 'erledigt' als zustand nicht verzichtet werden kann, könnte man sowas in der richtung machen:
SELECT IF(GROUP_CONCAT(DISTINCT state SEPARATOR ' ') LIKE '%offen%', 'offen', 'erledigt') FROM operation GROUP BY job_id
kA ob das so wirklich geht, war nur so ne idee
|
Neo1010
.
|
So hab mich dafür entschieden das der state nur 0 oder 1 sein kann und dieses select verwendet:
select job.job_id, job.project_id, job.note, job_type, job.originator, job.contact_person, case min(state) when 0 then 'offen' else 'erledigt' end as state from operation join job group by operation.job_id having job.project_id=".$_GET['p_id']
Funkt soweit ganz gut, mein einziges Problem ist jetzt das Jobs die keine Operationen haben nicht angezeigt werden.
Hoffe ihr könnt mir wieder so schnell helfen.
Danke an alle!
|
prayerslayer
Oar. Mh.
|
ein outer join ist normalerweise die lösung zu sowas.
|
Neo1010
.
|
hmm ich bekomm da einen syntax error wenn ich das mit outer join versuch...
... from operation outer join job....
oder?
|
prayerslayer
Oar. Mh.
|
|
__Luki__
bierernste Islandkritik
|
MS SQL Server 2005 oder so schaetz' ich mal. Oracle ist's defintitiv nicht.
|