Except selects, obwohl man alle Countet

Kampfgummibaerlie

Datenbank-Guru
Beiträge
743
Sodala, war länger inaktiv, weil der NAS nicht so wollte, wie ich, Schwester keine Zeit hat, und auch keine anderen "schnellen" Lösungsmöglichkeiten bestehen, programmiere ich die Seite erstmal auf dem Host Localhost, und connecte diesen wiederum mit dem NAS.

Aber, um zu meinem Problem zu kommen:
Ich hätte gerne als Result der Abfrage 3 Spalten, so nach dem Schema:
(Falls 2 Normale maschinen gemietet werden)
4 (maximale Anzahl an normalen Maschinen)
Normale (Typ der Maschinen, die in Spalte 1 gezählt werden)
2 (freie Maschinen, die zurzeit nicht gemietet werden)

Ich habe eine schnelle einfache Abfrage mal eben konstruiert, die auch halbwegs funktioniert, nur habe ich doch wiedermal eine weile Pause von der SQL-Sprache gehabt, und wie ich den lieben Mr. Elephant kenne, hat er immer einen Rat bei Hand ;)

Also, meine bisherige Abfrage sieht so aus:
Code:
select count(maschinen.typ) as summaschinen, maschinen_typen.typ from maschinen
inner join maschinen_typen on (maschinen.typ = maschinen_typen.id) group by
maschinen_typen.typ, maschinen_typen.besitztum order by maschinen_typen.besitztum
desc, summaschinen desc

Es kommt folgendes Ergebnis auf meiner derweiligen (lol, gerade damit angefangen, und der Spaß beginnt bereits):
4 Normale
2 Overlock
1 Coverlock
1 Stickmaschine
3 Mitgebrachte

Sodala, was ich jetzt gerne hätte (obiges Beispiel zur Hand genommen, und es wird keine andere Maschine gemietet, außer dieser 2 Normalen)
4 Normale 2
2 Overlock 2
1 Coverlock 1
1 Stickmaschine 1
3 Mitgebrachte 3

Ich hoffe, mein 1. Gedanke ist auch korrekt, dass ich hier wieder mit excepts oder so arbeiten muss. (ist mir klar ;))

Kommentar am Ende:
Ich habe 10 Tage gebraucht, um mal überhaupt auf die Idee zu kommen, dass ich die Homepage extern laufen lassen kann, und nicht zwangshaft am NAS laufen haben muss. (Mir ist klar, dass ich eben exakt sowas am Ende möchte, aber ja, Zwischenlösungsweg)

EDIT: Nur den Code ein wenig angepasst, damit er verständlicher wirkt.

Beispiel einer Funktionstüchtigen Except-Abfrage, nur leider nur 1 Column returned...
Code:
select count(maschinen.id) from maschinen except select vermietungen.maschinen_id from vermietungen 
where mietzeit @> now()::timestamp
 
Zuletzt bearbeitet:
Werbung:
Ich habe eine Tabelle namens maschinen_typen, in der die vorhanden maschinen_typen eintragbar sind, (Normale, Overlock, Coverlock, Stickmaschine, Mitgebrachte) und auch der entsprechende Mietpreis für den einzelnen Typ steht.
In der Tabelle maschinen stehen die einzelnen maschinen mit der ID des Typs und einer eigenen ID.

Ich würde gerne auf der Homepage es ca. so schreiben:
"Wir haben in Summe >Column1< Maschinen des Typs >Column2<, von welchen zurzeit >Column3< noch mietbar sind!"

Anbei wüsste ich auch nicht, was Prosa bedeuten soll ;) (in Österreich vl. weniger gängig?)

EDIT: Da ich mir die Codes zum schnellen erstellen aufhebe, lasse ich euch gerne teilhaben an meinen erstellten Tabellen:
Code:
create table maschinen_typen(id serial primary key, typ text unique, mietpreis money default '12');
create table maschinen(id serial primary key, typ integer references maschinen_typen(id));
INSERT INTO maschinen_typen(typ) values ('Normale');
INSERT INTO maschinen_typen(typ) values ('Overlock');
INSERT INTO maschinen_typen(typ) values ('Coverlock');
INSERT INTO maschinen_typen(typ) values ('Stickmaschine');
INSERT INTO maschinen_typen(typ) values ('Mitgebrachte');
INSERT INTO public.maschinen(typ) VALUES ('1');
INSERT INTO public.maschinen(typ) VALUES ('1');
INSERT INTO public.maschinen(typ) VALUES ('1');
INSERT INTO public.maschinen(typ) VALUES ('1');
INSERT INTO public.maschinen(typ) VALUES ('2');
INSERT INTO public.maschinen(typ) VALUES ('2');
INSERT INTO public.maschinen(typ) VALUES ('3');
INSERT INTO public.maschinen(typ) VALUES ('4');
INSERT INTO public.maschinen(typ) VALUES ('5');
INSERT INTO public.maschinen(typ) VALUES ('5');
INSERT INTO public.maschinen(typ) VALUES ('5');
 
Tabelle Vermietungen scheint auch wichtig zu sein... einen moment

Tabelle Vermietungen:
Code:
create table vermietungen(id serial primary key, maschinen_id integer references maschinen(id) not null, mietzeit tsrange default
tsrange(now()::timestamp, now()::timestamp+'2 hour'));

Der exclusion-constraint ist auch drinnen:
Code:
alter table vermietungen add constraint exclude_maschinen_id_in_time exclude using gist
(maschinen_id with =, mietzeit with &&);

EDIT: die ID bei Vermietungen mache ich mal eben zum PK in meiner Datenbank
 
ungetestet:

Code:
select t.typ, count(m) as anzahl, count(v) as verfuegbar from maschinen m left join maschinen_typen t on m.typ=t.id left join vermietungen v on v.maschinen_id=m.id where not v.mietzeit @> now()::timestamp group by t.typ;
 
Ich gebs zu, ich bekomms nicht hin ^^

Wäre vl. eine Hilfe, wenn du mir die verwendeten Abkürzungen schnell in einem Inhaltsverzeichniss darstellen könntest, vl. überreiß ichs dann ^^

Kommentar anbei:
Habe bisher auch nur mit inner joins gearbeitet :D
 
Da sind keine Abkürzungen. Nur Aliase: m, t und v. Man könnte diese durchaus auch länger als den originalen Tabellennamen gestalten ;-)
 
Lieber mr. Elephant, ich überreiße es nicht ^^
*mich alt fühle*....

Code:
select maschinen_typen.typ, count(maschinen.typ) from maschinen inner join maschinen_typen on (maschinen.typ = maschinen_typen.id) group by maschinen_typen.typ
except select maschinen_typen.typ, maschinen.typ from vermietungen inner join maschinen on (vermietungen.maschinen_id = maschinen.id)
inner join maschinen_typen on (maschinen.typ = maschinen_typen.id)
where mietzeit @> now()::timestamp

Nur irgendwie möchte er bei mir das not nicht annehmen.... außerdem denke ich, dass ich das beim 1. select machen muss, und nicht beim 2. (except) select...
:/

EDIT: Ich denke, ich muss mich mit left/right Joins anfreunden ^^
 
Sinn der Abfrage, wie ich sie gerne hätte:
1.: vorhandene Anzahl der Maschinen
2.: Typ der Maschinen
3.: zurzeit freie Maschinen

So nach dem Motto:
Column1 | Column2 | Column 3
4 | Normale | 3
2 | Overlock | 2
1 | Coverlock| 1
1 | Stickmaschine|1
3 | Mitgebrachte|3

In dem Beispiel wird zurzeit 1 Maschine des Typs "Normale" gemietet.
 
Du meinst sowas in der Richtung:
Code:
select sum(anzahl),typ,sum(anzahl)-count(id) as frei from(
select count(*) as anzahl, typ.typ ,ver.id
   from maschinen_typen typ
   join maschinen ma on(typ.id=ma.typ)
   left join vermietungen ver on(ma.id=maschinen_id)
  group by typ.typ,ver.id
  )group by typ
  order by typ

Die Tabelle vermietungen muss noch entsprechend über den range eingeschränkt werden, damit nur die offenen Vermietungen gezählt werden, da kenn ich die PG syntax aber nicht genau.
 
Soda, ich pushe hier mal wieder, weil ich noch immer nicht dahinter gekommen bin :/

Mein Ansatz sieht so aus:
Code:
select count(maschinen.typ), maschinen_typen.typ from maschinen inner join maschinen_typen on (maschinen.typ = maschinen_typen.id)
group by maschinen_typen.typ

In diesem Code würde ich eben gerne eine 3. Spalte einbauen, die mir simpl alle Maschinen des Typs zusammenzählt, die zurzeit nicht gemietet werden.
(Ich muss dazu sagen, ich lasse mir auch gerne left bzw. right joins näher beibringen, weil ich glaube ich mich mit solchen noch nie auseinandergesetzt habe, ich weiß nur, was sie tun...)
 
Werbung:
Akretschmer, deine Zeilen zu lesen, fällt mir schwer vom erfassen was was sein soll.

DrDimitri habe ich noch nicht probiert, weil ich seinen Code weniger beführworten würde, wenn er sogar dazu schreibt "kenne mich mit dem Syntax aber kaum aus", oder so. (vl. unterbewusste handlung, oder so)

Mein bisheriger Code sähe so aus:
Code:
select count(maschinen.typ), maschinen_typen.typ from maschinen inner join maschinen_typen on (maschinen_typen.id = maschinen.typ)
group by maschinen.typ, maschinen_typen.typ
except select maschinen_id, maschinen_typen.typ from vermietungen inner join maschinen on (vermietungen.maschinen_id = maschinen.id) inner join maschinen_typen
on (maschinen.typ = maschinen_typen.id) where mietzeit @> '2018-02-26 15:15'::timestamp without time zone

Mein Problem am Ende:
Ich habe irgendwie eine 3. Spalte hinbekommen, aber wenn ich 3 Spalten habe, kommen 0 Zeilen dabei raus.

Warum ich die mietzeit-spalte mit einem absoluten Timestamp vergleiche im where?
ich kann keine Mietungen mehr eintragen außerhalb der Öffnungszeiten, an Sonntagen, und so weiter ^^
 
Zurück
Oben