【问题标题】:MySQL excutes select after where clauseMySQL 在 where 子句之后执行 select
【发布时间】:2013-03-26 01:10:02
【问题描述】:

此查询在 where 子句中给出了一个错误 unknown column company。我发现 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+"%' 

【问题讨论】:

  • 那是因为您将嵌套选择的结果别名为“公司”——该列实际上并不存在。您不能在 where 语句中引用列别名。您应该重写此查询以使用 JOIN,然后对实际的 TransCompany.name 列进行过滤。
  • 公司列与其他列的行数不同
  • @Cory Thnx 为您的回复。我会尝试加入。
  • @user2033382:我回答了一个应该有效的查询。
  • @Cory 。是的,它工作正常。 Thnx 很多。不幸的是,由于缺乏声誉而无法投票。

标签: mysql select where


【解决方案1】:

您不能在 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'

【讨论】:

    【解决方案2】:

    您确实应该使用连接而不是子选择来执行此操作。我会推荐这个:

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

    【讨论】:

    • 非常感谢您的回复。我在上面得到了类似的答案。两个答案都很好。
    【解决方案3】:

    拉取列“company”的子查询没有匹配的行数,试试join语句吧

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多