zu vermeiden habe ich folgende DB-Tabellen, die ich abfragen versuche:Abfragen über mehrere Tabellen, die eine Vereinigung aller
t_shared_users
user_id
user_category
folder_id
expiry
t_documents
id
folder_id
user_id
user_category
description
created
updated
t_folder
id
type
user_id
user_category
created
updated
Ich möchte alle Dokumente finden, haben Sie besitzen und den gemeinsamen Zugriff auf. dh. Suchen Sie nach allen Dokumenten in t_documents, wobei user_id = 1 UND user_category = 100, aber auch diese Dokumente in den Ordner einschließen, auf den Sie in t_shared_users zugreifen können. Hier ist mein Versuch, bei der Abfrage:
SELECT
id,
folder_id,
user_id,
user_category,
description,
created,
updated
FROM
t_documents
WHERE
user_category = 100
AND user_id = 1
UNION ALL
SELECT
d.id,
d.folder_id,
d.user_id,
d.user_category,
d.description,
d.created,
d.updated
FROM
t_documents d
JOIN
t_shared_users s
ON
d.folder_id = s.folder_id
WHERE
d.user_category = 100
d.AND user_id = 1
ORDER BY
created ASC
LIMIT
10
Gibt es eine bessere/mehr performant/prägnante Art und Weise, diese Abfrage zu schreiben? Das obige scheint ein wenig wortreich und langsam.
edit:
CREATE TABLE t_folder (
id SERIAL NOT NULL,
user_category SMALLINT NOT NULL,
user_id INTEGER NOT NULL,
type INTEGER NOT NULL,
description TEXT,
created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
updated TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
PRIMARY KEY (id)
);
CREATE TABLE t_documents (
id BIGSERIAL NOT NULL,
folder_id INTEGER,
user_category SMALLINT NOT NULL,
user_id INTEGER NOT NULL,
description TEXT NOT NULL,
created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
updated TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
PRIMARY KEY (id)
);
CREATE TABLE t_shared_users (
id SERIAL,
folder_id INTEGER NOT NULL,
user_category INTEGER NOT NULL,
user_id INTEGER NOT NULL,
expiry TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
PRIMARY KEY (id)
);
http: // Meta. stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql-query – Strawberry
@Strawberry Ich war wonde klingeln, wenn es vielleicht einen effizienten/cleveren JOIN gab, der den gleichen Effekt hätte? –
wie in, wenn ich den Befehl "EXPLAIN-Analyse" ausführen, würde ich eine kleinere Obergrenze Kosten erhalten. Im Moment ist es wie folgt: Append (Kosten = 0,57..749.08 Zeilen = 282 Breite = 36) (tatsächliche Zeit = 0.024.0.047 Zeilen = 3 Schleifen = 1) –