mysql - ist diese query überhaupt möglich?

mysql - ist diese query überhaupt möglich?

am 26.02.2007 15:29:49 von Patrick Bates

ich habe eine tabelle, in der die datensätze etwa
so aussehen:

ID QUELL MENGE
1 -1 100
2 -1 20
3 1 100
4 5 200
5 -1 250
6 3 100

ich möchte jetzt eine liste aller jener ausgeben,
wo QUELL = '-1' und die MENGE minus MENGE wo
ID = QUELL > 0

also etwa so:
ID MENGE
2 20
5 50

greets
alex
-*--

Re: mysql - ist diese query überhaupt möglich?

am 26.02.2007 15:30:57 von dev-random

Hallo,

* Alexander Kainz [Mon, 26 Feb 2007 15:29:49 +0100]:
> wo QUELL = '-1'

WHERE quell = -1

> und die MENGE minus MENGE

Bitte?

> wo ID = QUELL > 0

Was?

Das verstehe ich nicht.

Gruß
Lutz

Re: mysql - ist diese query überhaupt möglich?

am 26.02.2007 16:06:18 von Patrick Bates

> Das verstehe ich nicht.

ich hab mich nicht optimal ausgedrückt:

am beispiel ID = 5 ... MENGE = 250
QUELL = 5 (ID 4) ... MENGE = 200

in dem sinne soll ausgegeben werden:

250 - 200

ID MENGE
5 50



greets
alex
-*--

Re: mysql - ist diese query überhaupt möglich?

am 26.02.2007 16:10:31 von Stefan+Usenet

On Mon, 26 Feb 2007 15:29:49 +0100 Alexander Kainz wrote:
> ich habe eine tabelle, in der die datensätze etwa
> so aussehen:
>
> ID QUELL MENGE
> 1 -1 100
> 2 -1 20
> 3 1 100
> 4 5 200
> 5 -1 250
> 6 3 100
>
> ich möchte jetzt eine liste aller jener ausgeben,
> wo QUELL = '-1' und die MENGE minus MENGE wo
> ID = QUELL > 0

Dunkel ist Deiner Rede Sinn.

> also etwa so:
> ID MENGE
> 2 20
> 5 50

Meinst Du so etwas wie das hier?

| SELECT t1.ID, t1.MENGE-t2.MENGE
| FROM t t1
| INNER JOIN t t2 ON t1.ID=t2.QUELL
| WHERE t1.QUELL=-1

Es passt zwar nicht ganz zur beispielhaften Ausgabe, aber...

Das Datenbanklayout wuerde ich aber in jedem Fall noch einmal
ueberdenken.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Stark und zufrieden. Mit Stefan. Ein rüstiges Vergnügen!
(Sloganizer)

Re: mysql - ist diese query überhaupt möglich?

am 26.02.2007 16:10:55 von Robert Klemme

On 26.02.2007 16:06, Alexander Kainz wrote:
>> Das verstehe ich nicht.
>
> ich hab mich nicht optimal ausgedrückt:
>
> am beispiel ID = 5 ... MENGE = 250
> QUELL = 5 (ID 4) ... MENGE = 200
>
> in dem sinne soll ausgegeben werden:
>
> 250 - 200
>
> ID MENGE
> 5 50

Ja, das sollte mit einem Selfjoin gehen.

select t1.id, t1.menge - t2.menge "MENGE"
from tab t1 join tab t2 on t1.id = t2.quell
where t1.quell = -1

.... oder so.

robert

Re: mysql - ist diese query überhaupt möglich?

am 26.02.2007 17:51:55 von Patrick Bates

> Ja, das sollte mit einem Selfjoin gehen.
>
> select t1.id, t1.menge - t2.menge "MENGE"
> from tab t1 join tab t2 on t1.id = t2.quell
> where t1.quell = -1
>
> ... oder so.

ja, so hab ich das hinbekommen, danke! es sollte jetzt nur
noch so sein, dass auch jene zeilen ausgegeben werden,
wo es garkein t1.id = t2.quell gibt.

greets
alex
-*--

Re: mysql - ist diese query überhaupt möglich?

am 26.02.2007 18:00:33 von Patrick Bates

>
> Das Datenbanklayout wuerde ich aber in jedem Fall noch einmal
> ueberdenken.
>

es handelt sich um eine auftragsverwaltung AUFTRAG / RECHNUNG

ich bin wie folgt vorgegangen:

tabelle BELEG
tabelle BELEG_POS

es gibt einen BELEG AUFtrag. dementsprech Positionen, welche die BELEG_ID
führen. Bei Bewegung (AUF => RECH), wird ein neuer BELEG REchnung angelegt,
und entsprechende Positionen angelegt, die im Feld QUELL_POS die REC_ID der
Quell-Position tragen.

Damit kann ich
- beliebige Mengen von Auftrag nach Rechnung kopieren
- Rückständige (noch nicht verrechnete Positionen) ermitteln (MENGE.AUF -
MENGE.RG)
- etc

und das ganze mit möglichst wenig zeilen.

hast du eine bessere idee? ich hab das selbst erdacht und gehe davon aus,
dass
jemand, der sich professionell damit beschäftigt warscheinlich nur
schmunzeln kann ;-)


greets
alex
-*--

Re: mysql - ist diese query überhaupt möglich?

am 26.02.2007 18:07:47 von Johannes Vogel

Hi Alexander

Alexander Kainz wrote:
>> Ja, das sollte mit einem Selfjoin gehen.
>> select t1.id, t1.menge - t2.menge "MENGE"
>> from tab t1 join tab t2 on t1.id = t2.quell
>> where t1.quell = -1
>> ... oder so.
> ja, so hab ich das hinbekommen, danke! es sollte jetzt nur
> noch so sein, dass auch jene zeilen ausgegeben werden,
> wo es garkein t1.id = t2.quell gibt.

left join statt join.
Wahrscheinlich musst du dann aber noch etwas mit den WHERE-Bedingungen
arbeiten...

HTH, Johannes

Re: mysql - ist diese query überhaupt möglich?

am 26.02.2007 18:13:14 von Christian Schmidt

Alexander Kainz schrieb:
>> Das Datenbanklayout wuerde ich aber in jedem Fall noch einmal
>> ueberdenken.

> es gibt einen BELEG AUFtrag. dementsprech Positionen, welche die BELEG_ID
> führen. Bei Bewegung (AUF => RECH), wird ein neuer BELEG REchnung angelegt,
> und entsprechende Positionen angelegt, die im Feld QUELL_POS die REC_ID der
> Quell-Position tragen.


Warum macht man sich (und anderen) eigentlich das Leben immer so schwer,
indem man Tabellen (oder Variablen oder whatever) unlesbar verkrüppelt.
_ID ist ja noch ok, aber AUF statt `auftrag` oder RECH statt `rechnung`
und dann sogar noch REC statt RECH. Da ist doch nix gespart.

chris, der sich grad mit dem Projekt von nem unfähigeren Vorgänger
rumplagt...

Re: mysql - ist diese query überhaupt möglich?

am 27.02.2007 15:50:31 von Stefan+Usenet

On Mon, 26 Feb 2007 18:00:33 +0100 Alexander Kainz wrote:
> > Das Datenbanklayout wuerde ich aber in jedem Fall noch einmal
> > ueberdenken.

> tabelle BELEG
> tabelle BELEG_POS

> es gibt einen BELEG AUFtrag. dementsprech Positionen, welche die
> BELEG_ID führen.

Soweit, so gut (zu den Feldbezeichnungen hat ja schon jemand etwas
geschrieben).

> Bei Bewegung (AUF => RECH), wird ein neuer BELEG REchnung angelegt,
> und entsprechende Positionen angelegt, die im Feld QUELL_POS die
> REC_ID der Quell-Position tragen.

Hm. Letztlich hast Du also in den beiden Tabellen sowohl Auftraege, als
auch Rechnungen drin, ohne Dir dabei Datensaetze zu ersparen (z.B. weil
die Positionen fuer beides verwendet wuerden). Was spraeche gegen ein
Modell, in dem es die Tabellen Order, OrderPosition, Invoice und
InvoicePosition gibt? Dann referenziert jede Invoice auf eine Order, bei
den Positionen ist es dementsprechend. Auf den ersten Blick sehe ich
nicht, dass Du irgendwo an Moeglichkeiten verlierst, Du gewinnst
allerdings deutlich an Flexibilitaet, weil Rechnungen u.U. teilweise
andere Felder benoetigen, als Auftraege.

> hast du eine bessere idee? ich hab das selbst erdacht und gehe davon
> aus, dass jemand, der sich professionell damit beschäftigt
> warscheinlich nur schmunzeln kann ;-)

Es geht immer noch irgendwie besser, aber mein Modell scheint mir fuer
die Applikationsentwicklung freundlicher und fuer den DB-Server
zumindestens neutral zu sein.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Freude in der Stille der Einsamkeit: Stefan!
(Sloganizer)