Я хочу удалить из 'table1' те строки, где (user_id = 5), но я должен проверить, являются ли эти сообщения (title = title1 в таблице2). Я использую Codeigniter, и я получаю эту ошибку при попытке удалить: «Удаления не допускаются, если они не содержат предложение« где »или« как ». Не могли бы вы помочь мне проверить, что не так с моим кодом ниже.
Таблица 1:
Таблица 2:
public function delete($title, $user_id){ $this->db->select('table1.*'); $this->db->from('table1','table2'); $this->db->where('table1.user_id', $user_id); $this->db->where('table2.title', $title); $this->db->join('table2','table1.post_id=table2.post_id'); $query = $this->db->get(); if ($query && $query->num_rows() > 0) { $this->db->delete('table1.*'); $this->db->from('table1','table2'); $this->db->where('table1.user_id', $user_id); $this->db->where('table2.title', $title); $this->db->join('table2','table1.post_id=table2.post_id'); return true; } else { return false; } }
Используйте подзапросы.
#Create where clause $this->db->select('id'); $this->db->from('table2'); $this->db->where('table2.title', $title); $where_clause = $this->db->get_compiled_select(); #Create main query $this->db->where('table1.user_id', $user_id); $this->db->where("`id` NOT IN ($where_clause)", NULL, FALSE); $this->db->delete('table1');
После запуска первого запроса вы получите набор пользователей, который вы должны удалить. Запустите этот цикл set foreach для получения идентификатора пользователя и сообщений, которые нужно удалить в массив.
$user_array = array(); $post_array = array(); foreach($query->result() as $query) { $user_array[$query->user_id] = $query->user_id; $post_user[$query->post_id] = $query->post_id; }
А потом
this->db->where_in('user_id', $user_array)->delete('table1'); this->db->where_in('post_id', $post_array)->delete('table2');
Я знаю, что это не лучшее решение. Но я думаю, что это наиболее понятно.
Вы можете использовать следующий код для удаления данных из таблиц becasue codeigniter ignore join при удалении нескольких данных из нескольких таблиц.
$sql = "DELETE t1 FROM table1 t1 JOIN table2 t2 ON t1.thing_id = t2.id WHERE t2.otherthing_id = ?"; $this->db->query($sql, array($id));
JOINS используются для извлечения данных из базы данных, не используемой для удаления данных, если вы хотите удалить данные из нескольких таблиц с помощью одного запроса, тогда вам нужно использовать каскадирование в MySQl, используя вы также можете удалить данные из других таблиц, связанных с текущей таблицей.