Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Redundante Datenbankabfrage? (https://www.delphipraxis.net/156264-redundante-datenbankabfrage.html)

pustekuchen 25. Nov 2010 14:15

Datenbank: Firebird • Version: 2.5 • Zugriff über: ISQL

Redundante Datenbankabfrage?
 
Guten Tag,

ich habe eine Datenbank die folgendermaßen aufgebaut ist.
SQL-Code:
CREATE TABLE restaurants (
id INT,
constraint restaurants_id primary key(id));

CREATE TABLE gerichte (
id INT,
restaurant_id INT NOT NULL,
constraint gerichte_id primary key(id));

CREATE TABLE bestellungen (
id INT,
gericht_id INT NOT NULL,
constraint bestellungen_id primary key(id));
Nun möchte ich ausgeben bekommen, welche Restaurants.id's alle in der Bestellung auftauchen.
D.h Wenn es 5 Restaurants in der Datenbank gibt. Und aber nur bei Restaurant 1 und 3 etwas bestellt wurde, soll auch nur 1 und 3 ausgegeben werden und diese auch nur jeweils 1x.

Ausgabe soll dann so aussehen:
SQL-Code:
          ID
============
           1
           3
Ich habe es folgendermaßen versucht:
SQL-Code:
SELECT restaurants.id FROM restaurants,bestellungen,gerichte WHERE gerichte.id = bestellungen.gericht_id AND gerichte.restaurant_id = restaurants.id;
Doch dort kommt folgendes raus:
SQL-Code:
          ID
============
           0
           0
           0
           1
           1
           1
           1
           1
           1
           1
Es liegt an der fehlenden Beziehung zwischen Bestellungen <-> Restaurants oder?
Oder kann man das anders lösen?

Danke für eure Hilfe

divBy0 25. Nov 2010 14:22

AW: Redundante Datenbankabfrage?
 
Ich kenne mich jetzt mit Datenbanken nicht so besonders gut aus, aber schau dir mal DISTINCT an.

rapante 25. Nov 2010 14:24

AW: Redundante Datenbankabfrage?
 
Hallo pustekuchen,

wenn du mehrere Bestellungen für ein Restaurant hast, dann werden diese auch genauso oft in deiner
Ausgabe aufgeführt.

Das Zauberwort heisst hier DISTINCT:
Code:
SELECT DISTINCT restaurants.id FROM restaurants,bestellungen,gerichte WHERE gerichte.id = bestellungen.gericht_id AND gerichte.restaurant_id = restaurants.id;
EDIT: Mal wieder zu langsam ;)

DeddyH 25. Nov 2010 14:25

AW: Redundante Datenbankabfrage?
 
Aus der hohlen Hand:
SQL-Code:
SELECT
  r.id
FROM
  bestellungen b
JOIN
  gerichte g ON g.id = b.gericht_id
JOIN
  restaurants r ON r.id = g.restaurant_id
Evtl. kannst Du noch gruppieren.

[edit] *Huch*, wo kommen denn die anderen Postings her? [/edit]

pustekuchen 25. Nov 2010 14:29

AW: Redundante Datenbankabfrage?
 
Ahhh DISTINCT :roll: Klappt wunderbar ;).Ich wußte doch das es so einen Befehl gibt, danke für den Tipp.
:dp:

Kann geclosed werden ;)

pustekuchen 25. Nov 2010 14:47

AW: Redundante Datenbankabfrage?
 
Mhh hätte noch eine frage dazu ;)

Wie könnte ich nun aus der Abfrage mit DISTRICT die Anzahl der Einträge bekommen? Also COUNT(*)
Geht das mit JOIN oder mit 'Subqueries inside aggregate functions'?

hoika 25. Nov 2010 14:51

AW: Redundante Datenbankabfrage?
 
Hallo,

geht denn nicht

SQL-Code:
SELECT count(DISTINCT restaurants.id)
FROM restaurants,bestellungen,gerichte
WHERE gerichte.id = bestellungen.gericht_id AND
gerichte.restaurant_id = restaurants.id
;



Heiko

pustekuchen 25. Nov 2010 14:54

AW: Redundante Datenbankabfrage?
 
Doch das geht natürlich, nur ich möchte beides in einem, wenn das überhaupt möglich ist ;)

DeddyH 25. Nov 2010 14:55

AW: Redundante Datenbankabfrage?
 
Ist denn die Gesamtanzahl gemeint oder je Restaurant?

[edit] Also so?
SQL-Code:
SELECT
  r.id, COUNT(*)
FROM
  bestellungen b
JOIN
  gerichte g ON g.id = b.gericht_id
JOIN
  restaurants r ON r.id = g.restaurant_id
GROUP BY r.id
[/edit]

pustekuchen 25. Nov 2010 15:00

AW: Redundante Datenbankabfrage?
 
@DeddyH Nope.

Mhh Okay ich versuchs mal besser zu erklären.

Bei dieser Abfrage kommt folgendes raus:

SQL-Code:
SELECT DISTINCT restaurants.id FROM restaurants,bestellungen,gerichte WHERE gerichte.id = bestellungen.gericht_id AND gerichte.restaurant_id = restaurants.id;
SQL-Code:
          ID
============
           0
           1
So und davon möchte ich die Anzahl der Einträge haben, also 2(0 und 1).

So das es z.B. so rauskommt:
SQL-Code:
COUNT(*)       ID
=================
 2              0
 2              1


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:40 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz