mysql - SQL:过滤计算列

标签 mysql sql

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

一张小 table

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 具有其最小值的所有行。最后一个条件不起作用。

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

建议?

最佳答案

您不能在 WHERE 子句中引用 no_dirs,因为 WHERESELECT 之前求值子句,所以 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

关于mysql - SQL:过滤计算列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20281898/

相关文章:

java - 数据截断 : Incorrect datetime value

Python MySQL 查询在 where 子句中使用字符串比较

mysql - 使用多个表中的数据更新 mysql 表

sql - SELECT ID 存在于第二个表中的行的最有效方法

mysql - 插入两个表之间自动递增不重置

mysql - 创建存储过程以更新新记录的字段

mysql - SQL - 使用 Case、When 对不同行的值求和

mysql - 将表id合并并替换为两个表SQL的字符串

java - 内容提供者查询构造和默认表

sql - SQL 的语法检查器和验证器?