我有一个出版物数据库,我需要获取有关作者的一些信息。作者字段是这样的,作者被集中在一个领域,例如,如果一本书有两个作者叫Robert Ludlum和John Grisham,在数据库中它被保存为Ludlum,R .; Grisham,J。; 如果特定作者点击他们的名字,我的应用程序需要假脱机信息并检索由特定作者撰写的书籍上的数据。我正在使用此语句来检索数据
$select = "SELECT tblPublications.Title, tblPublications.Year FROM tblPublications WHERE tblPublications.Authors LIKE '%$sname%'";
$sname
是一个引用作者姓氏的变量。如果两位作者拥有相同的姓氏,就会出现问题。但是我试图实现的解决方法是让应用程序获取姓氏,插入逗号,获取用户的第一个名称并获取第一个字母,然后将结果与stringe组合并将它们与作者中的每个逗号分隔值匹配如果是我正在寻找的Grisham的书,我会在我的查询中使用 * Grisham,J。 * 。
任何想法如何在PHP,MYSQL中做到这一点?
答案 0 :(得分:2)
如果可以重新设计数据库,您可能应该有一个authors表和一个book_authors表,它将书籍与作者联系起来,这样多个作者就可以与每本书相关联。来自用户点击的姓氏在哪里?是否可以将生成的链接设为LastName,名字的第一个字母?如果是这样,那么您可以更改链接,以便它包含第一个字母。但是仍然可以让两位作者姓氏相同,名字的第一个字母。所以我认为最好的解决方案是拥有一个authors表和一个Book_authors表,并将作者id存储为隐藏字段,并使用它来检索所选作者的书籍。
答案 1 :(得分:1)
您的数据库设计不正确,您尚未规范化数据
如果您使用like
搜索前导通配符,则会终止使用索引的任何机会
您唯一的修复选项(如果您想保留错误的CSV数据)是将表转换为MyISAM格式并在FULLTEXT
字段上添加authors
索引。
然后,您可以使用
搜索作者SELECT fielda, b,c FROM table1 WHERE MATCH(authors) against ('$lastname')
请参阅:http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
当然,更好的选择是规范化数据库并为具有链接表的作者创建单独的表。
TABLE books
------------
id primary key
other book data
TABLE authors
--------------
id primary key
lastname varchar (indexed)
other author data
TABLE author_book_link
----------------------
author_id
book_id
PRIMARY KEY ab (author_id, book_id)
现在,您可以使用非常快速的索引进行查询:
SELECT b.name, b.ISBN, a.name
FROM books b
INNER JOIN author_book_link ab ON (ab.book_id = b.id)
INNER JOIN author a ON (a.id = ab.author_id)
WHERE a.lastname = '$lastname'
答案 2 :(得分:0)
这完全取决于您从用户那里获得的输入。
如果用户只输入一个名称,那么你可以做的就不多了(因为不能保证他们会以正确的格式输入它来进行解析)。
如果要让他们输入名字和姓氏,可以这样做:
<?php
$firstname = trim(mysql_real_escape_string($_GET['fname']));
$surname = trim(mysql_real_escape_string($_GET['sname']));
$firstletter = substr($_GET['fname'],0,1);
$sname = $surname.', '.$firstletter;
$select = "SELECT tblPublications.Title,
tblPublications.Year
FROM tblPublications
WHERE tblPublications.Authors LIKE '%$sname%'";