我开发了一个电子书网站,我有作者的数据库表和发布者的表格...有时作者名称也会在publishers表中添加为出版商 现在我有他的作为作者和出版商的名字..当我在网站上搜索他的名字时,它返回两次因为我在authors表和publishers表中搜索然后合并两个查询
这是我的代码: -
function generate_results($keyword, $row = 0) {
$result1 = $this->db->query("SELECT au_id,au_name,au_state,SUBSTR(au_info,1,190) AS au_info,au_img FROM d_author where (au_name LIKE '%$keyword%' or au_info LIKE '%$keyword%') and au_state = '1' limit $row,20");
$result2 = $this->db->query("SELECT pub_id,pub_name,pub_state,SUBSTR(pub_info,1,190) AS pub_info,pub_img FROM d_publishing where (pub_name LIKE '%$keyword%' or pub_info LIKE '%$keyword%') and and pub_state = '1' limit $row,20");
$results = array_merge($result1->result_array(), $result2->result_array());
return $results;
}
现在我想将第二个查询修改为: 从“publishers table”中选择所有发布者,其中发布者的名称类似于$ keyword,并且在authors表中不存在此$关键字。 我的意思是如果作者中存在此名称,请不要在发布者中选择它 我怎样才能将这个含义翻译成Mysql Query
答案 0 :(得分:0)
首先,在继续开发电子书应用程序之前检查sql-injections。您的关键字似乎未被检查为安全参数。只是为了确定,你知道csrf和xss吗?如果没有,请检查一下。这非常重要。
其次,您应该考虑使用数据库设计来避免重复值。有关更多信息,请查看“数据库规范化”。好像你可以做另一个表来提取你的“联系信息”,如姓名,状态,身份等。这将使你的作者表和发布者表可以使用“contact_id”引用联系信息表。
最后但并非最不重要的是,要回答你的问题,你可以通过“反加入”来解决这些问题。在第二个查询中的authors表上使用左连接,并在与发布者表匹配时检查“IS NULL”。更多信息请访问:http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/
我不知道我是否完全理解你的数据库设计,但似乎UNION
结合DISTINCT
可以帮助你 - 你甚至不需要这个{{1 }}-东西。我建议你在mysql文档中查看这两个命令。