0

だから私はこのクエリを持っています(これは本番用ではなく、パフォーマンスに関係なく管理上データベースからデータを取得するためのクエリです)

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", 

ここで失敗する理由は誰にも分かりますか? つまり、エイリアスを使用していないということです。ゲストはテーブルの名前であり、最初の 2 つのサブクエリで問題なく読み取られます。3番目のサブクエリの違いは、JOINを使用していることです...何かアイデアはありますか? ありがとう

4

2 に答える 2

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;
于 2013-04-03T15:21:12.620 に答える
0

なぜそのクエリを実行しているのかわかりません。特定のテーブルから結果が得られる場合は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
于 2013-04-03T15:21:48.650 に答える