2013-10-28 16 views
1

考慮到下表中的數據庫如何在SELECT X FROM ...中使用SQLAlchemy中的位置X中的子查詢?

CREATE TABLE users (
    id SERIAL NOT NULL, 
    name VARCHAR, 
    PRIMARY KEY (id) 
) 

CREATE TABLE phones (
    id SERIAL NOT NULL, 
    user_id INTEGER, 
    phone VARCHAR, 
    PRIMARY KEY (id), 
    FOREIGN KEY(user_id) REFERENCES users (id) 
) 

CREATE TABLE emails (
    id SERIAL NOT NULL, 
    user_id INTEGER, 
    email VARCHAR, 
    PRIMARY KEY (id), 
    FOREIGN KEY(user_id) REFERENCES users (id) 
) 

而且我想知道每個用戶有多少電子郵件和電話號碼有。

而下面的查詢工作:

SELECT 
    users.id AS id, 
    users.name AS name, 
    (
    SELECT COUNT(*) 
    FROM emails WHERE emails.user_id = users.id 
) AS email_count, 
    (
    SELECT COUNT(*) 
    FROM phones WHERE phones.user_id = users.id 
) AS phone_count 
FROM users; 

但當SQLAlchemy中產生這樣的查詢:

SELECT 
    users.id, 
    users.name, 
    email_count.count_1, 
    phone_count.count_2 
FROM 
    users, 
    (
    SELECT count(*) AS count_1 
    FROM emails, users 
    WHERE emails.user_id = users.id 
) AS email_count, 
    (
    SELECT count(*) AS count_2 
    FROM phones, users 
    WHERE phones.user_id = users.id 
) AS phone_count 

我想用戶GROUP BY和加入他們的行列,但由於一些用戶不擁有兩個電子郵件和電話,它們被排除在外,我不喜歡OUTER JOIN中的NULL。

回答

1

更新SQL:

select e.id, e.name, distinct_email, distinct_phone 
from 
(
    select u.id, u.name, count(distinct e.id) as distinct_email 
    from users as u 
    left join emails as e 
    on u.id = e.user_id 
    group by u.id, u.name 
) AS e 
full outer join 
(
    select u.id, u.name, count(distinct p.id) as distinct_phone 
    from users as u 
    left join phones as p 
    on u.id = p.user_id 
    group by u.id, u.name 
) AS p 
on e.id = p.id 
+0

謝謝,它的工作原理,但是......不完美。也許你想添加DISTINCT到COUNT。但是如果表格沒有唯一的約束呢?如果我只有一個數,我會用這個。 –

相關問題