2009-07-28 179 views
0

LEFT JOIN隊ON teams.id =(SELECT TEAM_ID FROM auth_users WHERE ID = offers.user_id)子查詢中左連接

給我的團隊表的所有列,但一切都轉換爲NULL。

LEFT JOIN teams ON teams.id = 1

的作品就像一個魅力

當我做

SELECT (SELECT team_id FROM auth_users WHERE id = offers.user_id) as team_id 

TEAM_ID將是1

由於一些奇怪的原因,它不會在裏面JOIN工作。

完整的查詢:

SELECT projects.id, projects.title as title, winner_id, projects.user_id as user_id, until, pages, types.title as type, types.id as type_id, projects.id as id, offers.price as price, offers.delivery_date as delivery_date, teams.*, 
(SELECT COUNT(id) FROM comments WHERE comments.project_id = projects.id AND comments.private = 1) as comments, 
(SELECT COUNT(id) FROM uploads WHERE uploads.project_id = projects.id) as files, 
(SELECT country FROM auth_users WHERE auth_users.id = offers.user_id) as baser_country, 
(SELECT business FROM auth_users WHERE auth_users.id = offers.user_id) as baser_business, 
(SELECT CONCAT(firstname, ' ', lastname) FROM auth_users WHERE auth_users.id = offers.user_id) as baser_name, 
(SELECT team_id FROM auth_users WHERE id = offers.user_id) as team_id, 
(SELECT country FROM auth_users WHERE auth_users.id = projects.user_id) as customer_country, 
(SELECT business FROM auth_users WHERE auth_users.id = projects.user_id) as customer_business 
FROM projects 
JOIN types ON projects.type_id = types.id 
LEFT JOIN offers ON projects.id = offers.project_id 
LEFT JOIN teams ON teams.id = (SELECT team_id FROM auth_users WHERE id = offers.user_id) 
WHERE projects.user_id = 1 AND winner_id != 0 AND uploaded = 1 
GROUP BY projects.id 
ORDER BY projects.id DESC 
LIMIT 3 

提前感謝!

+1

請問您可以發佈完整的原始查詢(發生在「左連接」之前) – 2009-07-28 12:34:12

+0

1)什麼是問題?你給了我們一堆查詢,但它可以用來確定你實際上想要做什麼。 2)如果沒有查詢左側的其餘部分,我們不知道我們正在處理什麼。 – chaos 2009-07-28 12:34:12

回答

5

首先你應該擺脫所有這些子查詢。有了正確的加入,他們都不是真的需要。他們使查詢非常擁擠,並且不會影響查詢性能。

爲了我最好的理解你的查詢應該看起來像這樣。

SELECT 
    p.id     AS project_id, 
    MIN(p.title)   AS project_title, 
    MIN(winner_id)  AS winner_id, 
    MIN(p.user_id)  AS project_user_id, 
    MIN(until)   AS until, 
    MIN(pages)   AS pages, 
    MIN(t.id)   AS type_id, 
    MIN(t.title)   AS type_title, 
    MIN(o.price)   AS offer_price, 
    MIN(o.delivery_date) AS offer_delivery_date, 
    -- m.*, <-- this should be avoided, especially in a grouped query 
    COUNT(c.id)   AS count_comments, 
    COUNT(u.id)   AS count_files, 
    MIN(ao.country)  AS baser_country, 
    MIN(ao.business)  AS baser_business, 
    MIN(CONCAT(ao.firstname, ' ', ao.lastname)) AS baser_name, 
    MIN(ao.team_id)  AS baser_team_id, 
    MIN(ap.country)  AS customer_country, 
    MIN(ap.business)  AS customer_business 
FROM 
    projects p 
    INNER JOIN types  t ON p.type_id = t.id 
    LEFT JOIN offers  o ON o.project_id = p.id 
    LEFT JOIN comments c ON c.project_id = p.id AND comments.private = 1 
    LEFT JOIN uploads  u ON u.project_id = p.id 
    LEFT JOIN auth_users ao ON ao.id = o.user_id 
    LEFT JOIN auth_users ap ON ap.id = p.user_id 
    LEFT JOIN teams  m ON m.id = o.team_id 
WHERE 
    p.user_id = 1 
    AND winner_id != 0 
    AND uploaded = 1 
GROUP BY 
    p.id 
ORDER BY 
    p.id DESC 
LIMIT 3 

接下來,你不應該編寫一個分組查詢與輸出中既不分組也不聚集的字段。我在查詢的所有流氓未分組字段上使用了MIN()聚合函數。

我推薦使用短表別名,並且我建議在任何地方使用表別名:例如,作爲第三方讀者,當涉及表「winner_id」來自哪個表的問題時,我完全丟失了。