我在构建一些数据库表的过程中,但是我想到了一个可能的搜索问题。
这两个表格是Genres,一个2列表,其中包含由ID字段标识的音乐类型列表,即1 = Dance,2 = Rock,依此类推。还有一个Music表,一个包含Title,Artist和Genre_ID字段的多列表。是的,你是访客,Genre_ID是指类型表的ID。
我的问题是,如果我在由PHP支持的网站上有一个搜索框,并且该搜索框会查询关键字段,那么标题,艺术家和流派会得到最好的结果,我怎样才能让它正常运行在搜索中,当一个类型名称本身在一个单独的表中,而不是在音乐表中。
示例搜索将是" ACDC"摇滚音乐。
答案 0 :(得分:1)
创建一个可以连接两个表的视图。然后在WHERE子句中使用SELECT with LIKE或者更好地使用全文搜索来执行搜索作业。
视图
create view ViewMusicWithGenre as
select "*"
from Music as m
left join Genre as g on m.genre_id = g.id;
使用类似
的搜索选项select "*"
from ViewMusicWithGenre
where Title like '%<what_you_search>%'
or Artist like '%<what_you_search>%'
or Genre like '%<what_you_search>%';
我在“”中写了星号,因为我知道你不会使用星号。 左连接就在那里,因为你想要甚至没有指定类型的行(非常可能)。
全文搜索
这通常取决于您使用的数据库。这是例如Microsoft SQL Server 2014:
全文搜索 - http://technet.microsoft.com/en-us/library/ms142571.aspx
全文索引 - http://technet.microsoft.com/en-us/library/ms187317.aspx
查询全文搜索 - http://technet.microsoft.com/en-us/library/ms142583.aspx
编辑:用于MySQL数据库
MySQL不支持视图上的全文文件。所以你有几个选择:
您还必须记住,fulltext indeces仅适用于MyISAM存储引擎。
联合表的create语句
create table fulltextSearchTable (
Music_ID int not null primary key,
Music_Title varchar(1024) not null,
Music_Artist varchar(1024) not null,
Genre_ID int not null,
Genre_Title varchar(1024) not null,
fulltext(Music_Title, Music_Artist, Genre_Title)
) engine=MyISAM;
全文搜索选择
select "*"
from fulltextSearchTable
where match(Music_Title, Music_Artist, Genre_Title) against ('your_keyword');
答案 1 :(得分:1)
要在查询中连接多个表,您应该查看使用“join”语句。这篇文章的第一个答案不是重新发明轮子,而是很好地解释了它们...... When to use a left outer join
答案 2 :(得分:0)
您可以尝试 INNER JOIN :
$result=mysqli_query($YourConnection,"SELECT music.title, music.artist FROM music
INNER JOIN genres ON music.genre_id=genres.genre_id
WHERE music.title LIKE '$searchword'
OR music.artist LIKE '$searchword'
OR genres.genre LIKE '$searchword'");
然后打印结果如下:
while($row=mysqli_fetch_array($result)){
echo $row['title']." - ".$row['artist']."<br>";
}