2013-03-25 9 views
0

Этот запрос дает сообщение об ошибке неизвестной колонке компании в разделе where. Я обнаружил, что предложение where запускается первым, а потом запускается следующее. Это может быть ошибка здесь. Но я не знаю, как исправить это, чтобы получить компанию в наборе результатов.MySQL excutes select after where where

SELECT trnsdriverid, 
     name, 
     (SELECT transcompany.name 
     FROM transcompany, 
       transcompdriver 
     WHERE transcompany.trnscompid = transcompdriver.trnscompid) AS 'company', 
     address, 
     dob, 
     license, 
     telephone 
FROM transcompdriver 
WHERE ? LIKE 'All' 
     OR name LIKE '%"+keyword+"%' 
     OR company LIKE '%"+keyword+"%' 
     OR trnsdriverid LIKE '%"+keyword+"%' 
+0

Это потому, что вы альясинг результата вложенный выбор как «компания» - этот столбец фактически не существует. Вы не можете ссылаться на псевдонимы столбцов, где содержатся утверждения. Вы должны переписать этот запрос для использования JOIN, а затем выполнить фильтрацию в фактическом столбце 'TransCompany.name'. –

+0

столбец компании не имеет того же количества строк, что и другие столбцы –

+0

@Cory Thnx для вашего ответа. Я попробую присоединиться. – amal

ответ

1

Вы не можете ссылаться на псевдонимы столбцов, в которых содержатся утверждения. Вы должны переписать этот запрос, чтобы использовать JOIN, а затем сделать вашу фильтрацию по фактической колонке TransCompany.name, например:

select 
    d.trnsDriverID 
    ,d.name 
    ,c.name as [Company] 
    ,d.address 
    ,d.dob 
    ,d.license 
    ,d.telephone 
from 
    TransCompDriver d 
join 
    TransCompany c 
    on 
    c.trnscompid = d.trnscompid 
where 
    ? = 'All' 
    or 
    d.name like '%" + keyword + "%' 
    or 
    c.name like '%" + keyword + "%' 
    or 
    d.trnsDriverID like '%" + keyword + "%' 

Кроме того, не следует использовать LIKE где простой оператор равенства будет делать. Я изменил запрос выше, чтобы использовать = 'All'.

+0

Thnx много для вашей помощи. Теперь он работает нормально. – amal

0

Вы действительно должны делать это, используя соединение, а не подзапрос. Я рекомендовал бы это:

SELECT 
    d.trnsDriverID, 
    d.name, 
    c.name AS `company`, 
    d.address, 
    d.dob, 
    d.license, 
    d.telephone 
FROM 
    TransCompDriver AS d 
    INNER JOIN TransCompany AS c 
     ON d.trnsCompID = c.trnsCompID 
WHERE 
    ? like 'All' 
    OR d.name LIKE '%"+keyword+"%' 
    OR `company` LIKE '%"+keyword+"%' 
    OR d.trnsDriverID LIKE '%"+keyword+"%' 
+0

Thanx много для вашего ответа. Я получил аналогичный ответ выше. оба ответа работают нормально. – amal

0

Суб-запрос, который тянет столбец «компания» не имеет соответствия количества строк, попробуйте присоединиться заявление вместо

select trnsDriverID, name, t1.name AS company, address, dob, license, telephone  
from TransCompDriver JOIN (select trnsDriverID, name, 
(select TransCompany.name from TransCompany LEFT JOIN TransCompDriver 
ON TransCompany.trnsCompID=TransCompDriver.trnsCompID) AS t1 
where ? like 'All' or name like '%"+keyword+"%' or company like '%"+keyword+"%' 
or trnsDriverID like '%"+keyword+"%'