0

我为电子书开发了一个网站,我在数据库表中有作者出版商表..有时作者姓名也作为出版商添加到出版商表中现在我有他的名字作为作者和出版商..当我在网站上搜索他的名字,它返回两次,因为我在作者表和出版商表中搜索,然后合并两个查询

这是我的代码:-

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;
    }  

现在我想将第二个查询修改为类似的内容:从“发布者表”中选择所有发布者,其中发布者的名称类似于 $keyword 并且此 $keyword 在作者表中不存在..我的意思是如果此名称存在于作者不在出版商中选择它我如何将这个含义翻译成 Mysql 查询

4

1 回答 1

0

首先,在继续开发您的电子书应用程序之前检查 sql-injections。看起来您的关键字没有被检查为安全参数。只是为了确定,你知道 csrf 和 xss 吗?如果没有,也请检查一下。这个非常重要。

其次,您应该考虑进行数据库设计以避免重复值。查看“数据库规范化”以获取更多信息。似乎您可以制作另一个表来提取您的“联系信息”,例如姓名、状态、ID 等。这将使您的作者表和发布者表可以使用引用联系信息表的“contact_id”。

最后但并非最不重要的一点是,要回答您的问题,您通常可以使用“反连接”来解决此类问题。在第二个查询中对作者表使用左连接,并检查与发布者表匹配的“IS NULL”。更多信息在这里:http ://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/

我不知道我是否完全正确地理解了您的数据库设计,但它似乎UNION与 a 相结合DISTINCT可以帮助您——而且您甚至不需要这些array_merge东西。我建议您在 mysql 文档中查看这两个命令。

于 2013-09-10T12:56:51.790 回答