URL: https://www.overclockers.at/coding-stuff/brauch_wieder_mal_sql-select_204397/page_1 - zur Vollversion wechseln!
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
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
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 ...
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
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.
Sowas sollte man als booĺ machen. Dann wäre auch sichere summenabfrage möglich.
Boolean geht auch. Aber in einer extra state-tabelle könnt man noch verschiedene sprachen unterbringen, also zb:
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 alaCode:ID | GER | ENG 1 | Offen | Open 2 | Erledigt | Done
Was halt vor allem bei mehreren Sprachen sinnvoll is, kommt dann halt drauf an.Code:if (state == true) text = "offen"; else text = "erledigt";
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)
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
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 sicher weiß ichs halt auch nicht
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
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!
ein outer join ist normalerweise die lösung zu sowas.
hmm ich bekomm da einen syntax error wenn ich das mit outer join versuch...
... from operation outer join job....
oder?
ich habs immer mit
gemacht.Code:... FROM Tabelle_1 [LEFT|RIGHT] OUTER JOIN Tabelle_2 ON ...
MS SQL Server 2005 oder so schaetz' ich mal.
Oracle ist's defintitiv nicht.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025