SQL:过滤计算列

时间:2013-11-29 09:08:18

标签: mysql sql

我遇到了一个难以解决的问题,但我遇到了问题。

一张小桌子

create table tbl1
  ( a INT AUTO_INCREMENT NOT NULL UNIQUE PRIMARY KEY,
    b VARCHAR(100)
  );

和一些数据

insert into tbl1 
  (b) values
    ("/some/path/1"), 
    ("/some/path/2"), 
    ("/some/longer/path/1"),  
    ("/some/longer/path/2"),
    ("/some/way/1"),
    ("/some/longer/way/2");

我想这样查询:

select length(b) - length(replace(b, '/', '')) no_dirs, b
  from tbl1
  where b like "%path%"
     and no_dirs = min(no_dirs);

应返回no_dirs具有miminum值的所有行。最后一个条件不起作用。

我也摆弄了一个子查询,但无法让它工作。

建议?

2 个答案:

答案 0 :(得分:2)

您无法在no_dirs子句中引用WHERE,因为在WHERE子句之前评估了SELECT,因此no_dirs尚不存在

此外,您无法使用MIN。这是一个带子查询的解决方案:

SELECT length(b) - length(replace(b, '/', '')) no_dirs, b
FROM tbl1
WHERE b like "%path%"
  AND length(b) - length(replace(b, '/', '')) = (
                      SELECT MIN(length(b) - length(replace(b, '/', ''))) 
                      FROM tbl1
                      WHERE  b like "%path%" )

See it working on SQLFiddle

答案 1 :(得分:0)

您不能在where子句中使用列别名或分组列。因此,您使用计算和子选择

select length(b) - length(replace(b, '/', '')) no_dirs, b
  from tbl1
 where b like "%path%"
   and length(b) - length(replace(b, '/', '')) 
                             = (select min(no_dirs) from tbl1);