LEFT JOIN团队在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
提前致谢!
答案 0 :(得分: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
”来自的问题时,我完全迷失了,例如