MySQL在where子句后选择select

问题描述:

此查询在where子句中给出一个未知列公司的错误。我发现where子句先运行,然后select运行。这可能是这里的错误。但我不知道如何纠正这一点,以获得结果集公司。MySQL在where子句后选择select

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

那是因为你是走样的结果嵌套选择为“公司” - 该列实际上不存在。您不能在where语句中引用列别名。您应该重写此查询以使用JOIN,然后在实际的“TransCompany.name”列上进行过滤。 – 2013-03-25 17:02:58

+0

公司专栏没有与其他专栏 – 2013-03-25 17:05:02

+0

@Cory Thnx相同数量的行作为回复。我会尝试加入。 – amal 2013-03-25 17:09:16

您不能在where语句中引用列别名。你应该重写此查询,使用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 2013-03-25 17:19:16

你应该使用连接而不是子查询来做到这一点。我会推荐这:

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

非常感谢您的回复。我上面有类似的答案。这两个答案工作正常。 – amal 2013-03-25 17:27:37

子查询拉列“公司”,如果没有匹配的行数,尝试加入语句,而不是

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+"%'