两件事情:
第一:我建议的方案是不正确
我的真实情况要复杂得多,所以我做了著名的员工部门为例的情况。我犯了一个错误:我需要的是删除属于某个部门的所有员工。我想从相关表的基于表的条件中删除数据。
事实上,你不能删除有雇员姓名约翰的部门,因为部门不是空的,还有约翰! :d
事情是这样的:
-- Create structures
CREATE TABLE IF NOT EXISTS departments (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(45) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
CREATE TABLE IF NOT EXISTS employees (
id int(11) NOT NULL AUTO_INCREMENT,
department_id int(11) NOT NULL,
name varchar(45) NOT NULL,
PRIMARY KEY (id),
KEY fk_employees_department_idx (department_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
ALTER TABLE employees
ADD CONSTRAINT fk_employees_departments FOREIGN KEY (department_id) REFERENCES departments (id) ON DELETE NO ACTION ON UPDATE NO ACTION;
-- Populate some data
INSERT INTO departments (id, name) VALUES
(1, 'Sales'),
(2, 'TI'),
(3, 'HHRR');
INSERT INTO employees (id, department_id, name) VALUES
(1, 1, 'John'),
(2, 1, 'Mary'),
(3, 2, 'Mark'),
(4, 3, 'Lorenzo');
-- Delete all employees that belong to the TI department (Mark should be removed)
DELETE emp FROM employees emp
INNER JOIN departments dep ON emp.department_id = dep.id AND dep.name = 'TI';
第二:你可以在CakePHP中做到这一点很容易
你可以得到以前的查询相同的结果这样做:
$departments = $this->Employees->Departments->find()
->select(['Departments.id'])
->where(['Departments.name' => 'TI']);
$this->Employees->deleteAll(['Employees.department_id IN' => $departments]);
由此产生的MySQL查询将是:
DELETE FROM employees WHERE department_id in
(SELECT Departments.id AS `Departments__id`
FROM departments Departments
WHERE Departments.name = 'TI')
......这是正确的,而且容易理解。 @arilia,你用第一个答案指出了这个方向。对不起,我对此深表歉意。
谢谢@arilia。实际上,为了获得这个查询,你应该把''id'=> $ departments'改成''id IN'=> $ departments',否则你得到的是一个等号“=”。另一方面,该查询返回[1093 mysql错误](http://stackoverflow.com/questions/45494/mysql-error-1093-cant-specify-target-table-for-update-in-from-条款)。 – pperejon
无论如何,根据[文档](http://dev.mysql.com/doc/refman/5.6/en/update.html),生成的SQL查询仍然是错误的,他们说_您无法更新表并从中进行选择子查询中的同一张表._ – pperejon
我对此不了解。我将编辑或删除我的答案 – arilia