![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: ISQL
Redundante Datenbankabfrage?
Guten Tag,
ich habe eine Datenbank die folgendermaßen aufgebaut ist.
SQL-Code:
Nun möchte ich ausgeben bekommen, welche Restaurants.id's alle in der Bestellung auftauchen.
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)); 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:
Ich habe es folgendermaßen versucht:
ID
============ 1 3
SQL-Code:
Doch dort kommt folgendes raus:
SELECT restaurants.id FROM restaurants,bestellungen,gerichte WHERE gerichte.id = bestellungen.gericht_id AND gerichte.restaurant_id = restaurants.id;
SQL-Code:
Es liegt an der fehlenden Beziehung zwischen Bestellungen <-> Restaurants oder?
ID
============ 0 0 0 1 1 1 1 1 1 1 Oder kann man das anders lösen? Danke für eure Hilfe |
AW: Redundante Datenbankabfrage?
Ich kenne mich jetzt mit Datenbanken nicht so besonders gut aus, aber schau dir mal DISTINCT an.
|
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:
EDIT: Mal wieder zu langsam ;)
SELECT DISTINCT restaurants.id FROM restaurants,bestellungen,gerichte WHERE gerichte.id = bestellungen.gericht_id AND gerichte.restaurant_id = restaurants.id;
|
AW: Redundante Datenbankabfrage?
Aus der hohlen Hand:
SQL-Code:
Evtl. kannst Du noch gruppieren.
SELECT
r.id FROM bestellungen b JOIN gerichte g ON g.id = b.gericht_id JOIN restaurants r ON r.id = g.restaurant_id [edit] *Huch*, wo kommen denn die anderen Postings her? [/edit] |
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 ;) |
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'? |
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 |
AW: Redundante Datenbankabfrage?
Doch das geht natürlich, nur ich möchte beides in einem, wenn das überhaupt möglich ist ;)
|
AW: Redundante Datenbankabfrage?
Ist denn die Gesamtanzahl gemeint oder je Restaurant?
[edit] Also so?
SQL-Code:
[/edit]
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 |
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:
So und davon möchte ich die Anzahl der Einträge haben, also 2(0 und 1).
ID
============ 0 1 So das es z.B. so rauskommt:
SQL-Code:
COUNT(*) ID
================= 2 0 2 1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz