Hen*_*oom 0 mysql join subquery
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
提前致谢!
首先,你应该摆脱所有这些子查询.通过正确的连接,它们都不是必需的.它们使查询非常拥挤,并且它们对查询性能没有贡献.
我最好的理解你的查询应该是这样的.
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
Run Code Online (Sandbox Code Playgroud)
接下来,您永远不应该编写一个分组查询,其中输出中的字段既不是分组也不是聚合.我在MIN()
查询的所有流氓未分组字段中使用了聚合函数.
我建议使用短表别名,我建议在任何地方使用表别名:作为第三方读者,当谈到表" winner_id
"来自的问题时,我完全迷失了.
归档时间: |
|
查看次数: |
610 次 |
最近记录: |