В чем ошибка в этой команде SQL? - PullRequest
1 голос
/ 09 сентября 2011

В чем ошибка в этой команде SQL

select account_id,fname,lname ,
    (select email from account where id=account_id) as email 
from user_account 
where account_id in (
       select destination_id 
       from friendship 
       where source_id=$user_id) 
    and (concat(fname,lname) like '%a%' or email like '%a%')

Где email - это столбец в account таблице

Сообщение об ошибке: Unknown column email

Я хочу получить электронную почту и проверить ее так же, как fname + lname

Ответы [ 4 ]

2 голосов
/ 09 сентября 2011

Похоже, в вашей таблице user_account нет столбца с именем email, на который есть ссылка в предложении WHERE. Попробуйте вместо этого JOIN:

   select ua.account_id,
          ua.fname,
          ua.lname, 
          a.email 
from user_account ua
inner join  account a where ua.id = a.account_id
and a.account_id  in ( select destination_id from friendship where source_id=$user_id) 
and (concat(fname,lname) like '%a%' or email like '%a%');
1 голос
/ 09 сентября 2011

Переформатирование запроса на удобочитаемость:

SELECT account_id, fname, lname,
       (SELECT email FROM account WHERE id = account_id) AS email
  FROM user_account 
 WHERE account_id IN (SELECT destination_id FROM friendship WHERE source_id = $user_id)
   AND (CONCAT(fname, lname) LIKE '%a%' OR email LIKE '%a%')

Наиболее вероятная причина неполадок состоит в том, что единственная таблица, на которую столбец email может ссылаться в главном предложении WHERE, это user_account, ноСтолбец email находится только в таблице account.

Самое простое решение - удалить подзапрос в списке выбора и использовать вместо него обычное объединение:

SELECT u.account_id, u.fname, u.lname, a.email
  FROM user_account AS u
  JOIN account      AS a ON a.id = u.account_id
 WHERE account_id IN (SELECT destination_id
                        FROM friendship AS f
                       WHERE f.source_id = $user_id)
   AND (CONCAT(u.fname, u.lname) LIKE '%a%' OR a.email LIKE '%a%');

Я предполагаю, что $user_id является входным значением, и запись имеет смысл в вашей системе;в SQL оно обычно недопустимо.

Не ясно, что предложение IN имеет много преимуществ;это тоже можно объединить с другими таблицами.

0 голосов
/ 09 сентября 2011

В чем ошибка в этой команде SQL

select account_id,fname,lname ,
(select email from account where id=account_id) as email from user_account 
where account_id 
  in ( select destination_id from friendship where source_id=$user_id) and          (concat(fname,lname) like '%a%' or email like '%a%')

Проблема заключается в том, что в следующем синтаксисе email является псевдонимом таблицы, а не именем столбца

(select email from account where id=account_id) as email

Похоже, вы уже получили лучший подход от p.campell, хотя

0 голосов
/ 09 сентября 2011

Я предполагаю, что ваш идентификатор в таблице Accout такой же, как Account_id в User_Account, а также Destination_id в таблицах дружбы.

select ua.account_id,
       ua.fname,
       ua.lname, 
       a.email 
from user_account ua
inner join  account a where ua.id = a.account_id
and a.account_id  
in ( select destination_id from friendship where source_id=$user_id) and (concat(fname,lname) like '%a%' or email like '%a%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...