2013-04-03 40 views
0

所以我有這個查詢(即不是用於生產,只是一個查詢從數據庫中獲得一些數據管理上無論性能)MySQL不能訪問別名的子查詢

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' 

線造成的問題是第3子查詢:

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

任何人有,爲什麼在這裏失敗,任何想法?我的意思是我沒有使用別名,guest虛擬機是表的名稱,它在2個第一個子查詢中被讀取成OK。第三個子查詢的區別在於它使用JOIN ...任何想法?謝謝

回答

1

不知道你爲什麼按照你的方式運行該查詢。我建議您使用joinleft 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 
+0

感謝它的工作! – user28490

2

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;