Brauch wieder mal SQL-Select

Seite 1 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/brauch_wieder_mal_sql-select_204397/page_1 - zur Vollversion wechseln!


Neo1010 schrieb am 01.02.2009 um 23:21

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


DKCH schrieb am 01.02.2009 um 23:34

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 schrieb am 02.02.2009 um 00:03

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 ...


prayerslayer schrieb am 02.02.2009 um 11:58

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 :D


tinker schrieb am 02.02.2009 um 12:01

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 schrieb am 02.02.2009 um 12:36

Sowas sollte man als booĺ machen. Dann wäre auch sichere summenabfrage möglich.


tinker schrieb am 02.02.2009 um 12:46

Boolean geht auch. Aber in einer extra state-tabelle könnt man noch verschiedene sprachen unterbringen, also zb:

Code:
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
Code:
if (state == true) 
  text = "offen"; 
else text = "erledigt";
Was halt vor allem bei mehreren Sprachen sinnvoll is, kommt dann halt drauf an.

@prayerslayer: :D
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 schrieb am 02.02.2009 um 12:49

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 schrieb am 02.02.2009 um 12:59

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 :D


SilentBob schrieb am 02.02.2009 um 13:18

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 schrieb am 03.02.2009 um 20:05

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 schrieb am 03.02.2009 um 20:35

ein outer join ist normalerweise die lösung zu sowas.


Neo1010 schrieb am 03.02.2009 um 20:54

hmm ich bekomm da einen syntax error wenn ich das mit outer join versuch...

... from operation outer join job....

oder?


prayerslayer schrieb am 03.02.2009 um 21:03

ich habs immer mit

Code:
... FROM Tabelle_1 [LEFT|RIGHT] OUTER JOIN Tabelle_2 ON ...
gemacht.

http://en.wikipedia.org/wiki/Join_(SQL)#Outer_joins
http://www.google.com/search?source...&meta=lr%3D

mit was arbeitest genau?


__Luki__ schrieb am 03.02.2009 um 21:05

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