有这样的表格
CREATE TABLE line (
id int(11) NOT NULL AUTO_INCREMENT,
Command varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO line (id,Command) values(1,'A');
INSERT INTO line (id,Command) values(2,'B');
INSERT INTO line (id,Command) values(3,'C');
INSERT INTO line (id,Command) values(4,'D');
INSERT INTO line (id,Command) values(5,'A');
我想引用条件中的别名。
SELECT (SELECT `id` FROM `line` WHERE `command` = 'A') as `a` FROM `line` WHERE `a` != 5
如何在没有更多查询的情况下执行此操作?
你没有。
您必须物理重复子查询,但它不会再次执行。
服务器在计算WHERE
时执行子查询,SELECT
在返回行时重用该结果。 优化程序识别出该值是等效的。
许多人忽略了一个事实,即SELECT
是先写的,但不是先写的。 WHERE
发生得更早。 SELECT
返回WHERE
确定应包含(或不应排除(的数据。
从概念上讲,操作的发生方式与在查询中表达的方式不同...它以更像这样的顺序发生:
FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
ORDER BY
因此,从技术上讲,如果子查询的出现之一是多余的......然后,从技术上讲,冗余外观实际上是SELECT
中的那个,而不是WHERE
中的那个。
不能在 where 子句中使用别名。
尝试使用联接
SELECT t1.id FROM `line` t1 join line t2 on t1.id=t2.id where t2.`command`='A' and t2.id!=5
也见小提琴。并重命名列命令,它是一个关键字。
mysql 中不允许在 where 条件中使用别名,但可以使用 not in 获得结果
select id FROM line
where id not in (
SELECT id
FROM line
WHERE command = 'A'
and id =5)
或使用内部联接
select id FROM line as t1 where id
inner join (
SELECT id
FROM line
WHERE command = 'A'
and id =5
) a on t1.id <> a.id
以及创建视图