我有一张有很多记录的表。我需要检查重复项。 我有以下查询:
public function findduplicates(){
$query = $this->db->query(
'SELECT book_id, auth_last , ebooks.ebook_title, storage_sys, ebook_path, AZ FROM ebooks
INNER JOIN( SELECT ebook_title FROM ebooks GROUP BY ebook_title HAVING COUNT(ebook_title) >1 ) temp ON ebooks.ebook_title = temp.ebook_title'
);
if($query->num_rows() > 0){
return $query->result();
}else{
return FALSE;
}
}
查询在我看来产生以下结果,这就是我要寻找的:
Array
(
[0] => stdClass Object
(
[book_id] => 31
[auth_last] => Aardenburg
[ebook_title] => 06 Bas Banning en de Tour de France.epub
[storage_sys] => 1
[ebook_path] => Aardenburg, A van - 06 Bas Banning en de Tour de France.epub
[AZ] => A
)
[1] => stdClass Object
(
[book_id] => 46
[auth_last] => Van
[ebook_title] => 06 Bas Banning en de Tour de France.epub
[storage_sys] => 1
[ebook_path] => Aardenburg A van - 06 Bas Banning en de Tour de France.epub
[AZ] => B
)
)
因为表非常大,我想限制我的选择,向我的方法添加两个参数:
public function findduplicates($sys_code,$folder_name){
$query = $this->db->query(
'SELECT book_id, auth_last , ebooks.ebook_title, storage_sys, ebook_path, AZ FROM ebooks WHERE storage_sys = $sys_code AND AZ = $folder_name
INNER JOIN( SELECT ebook_title FROM ebooks GROUP BY ebook_title HAVING COUNT(ebook_title) >1 ) temp ON ebooks.ebook_title = temp.ebook_title'
);
if($query->num_rows() > 0){
return $query->result();
}else{
return FALSE;
}
}
这给了我来自 MariaDb near 'INNER JOIN...'
的错误
我试过:
WHERE storage_sys = '.$sys_code.' AND AZ = '.$folder_name.'
具有相同的结果和:
WHERE (storage_sys = `'.$sys_code.'` AND AZ = `'.$folder_name.'`
也没有运气。
答案 0 :(得分:1)
JOIN
位于任何 WHERE
子句之前。 PHP 变量不应该直接放在 SQL 中,它们需要单独绑定。用占位符 ?
替换变量,然后使用 bind_param()
绑定它们。
如果您使用的是 CodeIgniter,那么它应该是这样的:
public function findduplicates():array {
$sql = 'SELECT book_id, auth_last, ebooks.ebook_title, storage_sys, ebook_path, AZ
FROM ebooks
INNER JOIN( SELECT ebook_title FROM ebooks GROUP BY ebook_title HAVING COUNT(ebook_title) >1 ) temp ON ebooks.ebook_title = temp.ebook_title
WHERE storage_sys = ? AND AZ = ?';
$db->query($sql, [$sys_code, $folder_name]);
return $query->result();
}
答案 1 :(得分:0)
JOIN
是 FROM
的一部分而不是 WHERE
的一部分:
SELECT book_id, auth_last , ebooks.ebook_title, storage_sys, ebook_path, AZ FROM ebooks
INNER JOIN( SELECT ebook_title FROM ebooks GROUP BY ebook_title HAVING COUNT(ebook_title) >1 ) temp ON ebooks.ebook_title = temp.ebook_title'
WHERE storage_sys = '$sys_code' AND AZ ='$folder_name'
你也会遗漏字符串周围的单引号。
并且你应该了解准备好的语句以防止 SQL 注入