Postgresql
使用另一個表中的外鍵選擇一行
嗨,我正在使用 python、sqlalchemy 和 postgresql 創建關係數據庫
我有 2 個表
Users
,並且Connections
Users
有關於每個使用者的資訊以及他們的id
asprimary-key
和Connections
他們的id
(Users.id
) 作為Foreign-key
想像我將多個使用者 ID 添加到 Connections 中,片刻之後我想選擇一個使用者在他們的行中有特定資訊的Users table
行例如 :
Table Users : Column id BIGINT primary key Column age INTEGER Table Connections: Column user_id BIGINT ForeignKey(Users.id) Column Connection_id VARCHAR(100) SELECT id FROM Connections WHERE Users(Connections.id).age = 20 limit 1;
我該怎麼辦?
首先(儘管它不適用於這種情況),您應該始終在此處包含您的 PostgreSQL 版本以及任何問題。
你指的是一個
[INNER] JOIN
. 這裡解釋了不同類型的連接。那裡有許多關於不同連接類型的連結。因此,在這種情況下,我會執行以下操作:
CREATE TABLE my_user ( id INT NOT NULL, age INT NOT NULL, PRIMARY KEY (id) );
和
CREATE TABLE connection ( connection_id INT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (connection_id), CONSTRAINT conn_user_fk FOREIGN KEY (user_id) REFERENCES my_user (id) );
填充它們:
INSERT INTO my_user VALUES (1, 50), (2, 45), (3, 73);
和
INSERT INTO connection (user_id, connection_id) VALUES (1, 500), (1, 501), (1, 502), (1, 503), (1, 504), (2, 601), (2, 602), (2, 603), (2, 604), (2, 605), (3, 701), (3, 702), (3, 703), (3, 704);
然後執行以下 SQL:
SELECT u.id, u.age, c.connection_id, c.user_id FROM my_user u JOIN connection c ON u.id = c.user_id;
結果:
id age connection_id user_id 1 50 500 1 1 50 501 1 1 50 502 1 1 50 503 1 1 50 504 1 2 45 601 2 2 45 602 2 2 45 603 2 2 45 604 2 2 45 605 2 3 73 701 3 3 73 702 3 3 73 703 3 3 73 704 3
因此,您擁有兩個表中的所有資訊。如果您有更多欄位,您可能希望根據您的要求包括或排除它們。
一句強烈的建議。不要儲存人們的年齡。相反,儲存他們的生日並即時計算他們的年齡!
例如:
CREATE TABLE my_user_bis ( id INTEGER, bday TIMESTAMPTZ );
1 條記錄作為樣本:
SELECT *, AGE(CURRENT_DATE, bday::DATE), EXTRACT(YEAR from AGE(bday)) FROM my_user_bis;
結果:
id bday age date_part 1 2000-05-05 00:00:00+01 21 years 11 mons 16 days 21
如果您不儲存生日並即時進行計算,您將開始收到錯誤 - 如果現在 53 歲的人在 3 年內訪問記錄會發生什麼 - 它仍會將他顯示為 53 歲。除非您實施一些每年年底都會觸發一次可怕的黑客攻擊!呸!我的建議是儲存生日——如果使用者願意提供他們的年齡,那麼他們沒有理由不提供生日!
歡迎來到 dba.se!