繁体   English   中英

MySQL无法在子查询中访问别名

[英]MySQL can not access alias in a subquery

所以我有这个查询(不是用于生产用途,只是一个查询,无论性能如何,都可以从数据库中管理地获取一些数据)

SELECT 
  `guests`.`id`, 
   CONCAT(u.`fname`, '', u.`lname`) "name", 
  `u`.`id` "u", 
   (SELECT COUNT(r.id) FROM reservations r WHERE r.guest_id=guests.id) "reservations", 
   (SELECT COUNT(t.id) FROM tasks t WHERE t.guest_id = guests.id) "tasks", 
   (SELECT COUNT(m.id) FROM scheduled_emails m JOIN reservations r ON (r.guest_id = `guests`.`id` AND m.reservation_id = r.id)) "emails", 
  `guests`.`created` "created", 
  `guests`.`updated` "updated" 
FROM `guests`
JOIN `users` AS u ON u.`id` = `guests`.`user_id` LIMIT 0,25

我得到

#1054 - Unknown column 'guests.id' in 'on clause'

引起问题的行是第三个子查询:

(SELECT COUNT(m.id) FROM scheduled_emails m JOIN reservations r ON (r.guest_id = `guests`.`id` AND m.reservation_id = r.id)) "emails", 

有人知道为什么它在这里失败吗? 我的意思是我没有使用别名,guests是表的名称,在前两个子查询中读取为OK。 第三个子查询的区别在于它使用的是JOIN ...有什么想法吗? 谢谢

直接JOIN所有表,而不是使用相关子查询来执行。 像这样:

SELECT 
  g.id, 
  u.name, 
  `u`.`id`                  AS u, 
  g.`created`               AS created, 
  g.`updated`               AS updated,
  COUNT(r.id)               AS reservations, 
  COUNT(t.id)               AS tasks, 
  COUNT(m.id)               AS emails, 
FROM `guests`               AS g
INNER JOIN reservations     AS r  ON r.guest_id = g.id
INNER JOIN tasks            AS t  ON t.guest_id = g.id
INNER JOIN scheduled_emails AS m  ON r.guest_id = g.id
                                 AND r.id       = m.reservation_id 
INNER JOIN
(
   SELECT id, CONCAT(u.`fname`, '', u.`lname`) AS name
   FROM `users`          
)AS u  ON u.id       = g.user_id
GROUP BY g.id, 
         u.id,
         u.name, 
         g.created, 
         g.updated
LIMIT 0, 25;

不知道为什么要按原样运行该查询。 我建议对所有内容使用join ,如果不给定表会产生结果,则建议不使用left outer join

SELECT 
  `guests`.`id`, 
   CONCAT(u.`fname`, '', u.`lname`) "name", 
  `u`.`id` "u", 
   COUNT(r.id) "reservations", 
   COUNT(t.id) "tasks", 
   COUNT(m.id) "emails", 
  `guests`.`created` "created", 
  `guests`.`updated` "updated" 
FROM `guests`
    JOIN `users` AS u ON u.`id` = `guests`.`user_id` 
    JOIN reservations r ON r.guest_id=guests.id
    JOIN tasks t WHERE t.guest_id = guests.id
    JOIN scheduled_emails m ON (r.guest_id = `guests`.`id` AND m.reservation_id = r.id)
GROUP BY g.id, u.id, u.name, g.created, g.updated
LIMIT 0,25

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM