"We are back" « oc.at

Brauch wieder mal SQL-Select

Neo1010 01.02.2009 - 23:21 1776 16
Posts

Neo1010

.
Registered: May 2003
Location: -
Posts: 1212
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
...
Registered: Aug 2002
Location: #
Posts: 3297
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
Avatar
Registered: Sep 2002
Location: .
Posts: 1240
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.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
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
Bearbeitet von prayerslayer am 02.02.2009, 12:04

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5249
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
Registered: Jun 2005
Location: Germany
Posts: 2951
Sowas sollte man als booĺ machen. Dann wäre auch sichere summenabfrage möglich.

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5249
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

Agnotologe
Registered: Oct 2005
Location: VIE
Posts: 4223
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.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
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

Little Overclocker
Avatar
Registered: Jan 2002
Location: Home
Posts: 59
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

.
Registered: May 2003
Location: -
Posts: 1212
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.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
ein outer join ist normalerweise die lösung zu sowas.

Neo1010

.
Registered: May 2003
Location: -
Posts: 1212
hmm ich bekomm da einen syntax error wenn ich das mit outer join versuch...

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

oder?

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
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__

bierernste Islandkritik
Avatar
Registered: Nov 2003
Location: gradec
Posts: 2990
MS SQL Server 2005 oder so schaetz' ich mal.
Oracle ist's defintitiv nicht.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz