我遇到了一个难以解决的问题,但我遇到了问题。
一张小桌子
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值的所有行。最后一个条件不起作用。
我也摆弄了一个子查询,但无法让它工作。
建议?
答案 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%" )
答案 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);