MySQL搜索多个表

时间:2014-05-15 21:52:27

标签: php mysql sql

我在构建一些数据库表的过程中,但是我想到了一个可能的搜索问题。

这两个表格是Genres,一个2列表,其中包含由ID字段标识的音乐类型列表,即1 = Dance,2 = Rock,依此类推。还有一个Music表,一个包含Title,Artist和Genre_ID字段的多列表。是的,你是访客,Genre_ID是指类型表的ID。

我的问题是,如果我在由PHP支持的网站上有一个搜索框,并且该搜索框会查询关键字段,那么标题,艺术家和流派会得到最好的结果,我怎样才能让它正常运行在搜索中,当一个类型名称本身在一个单独的表中,而不是在音乐表中。

示例搜索将是" ACDC"摇滚音乐。

3 个答案:

答案 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不支持视图上的全文文件。所以你有几个选择:

  • 使用LIKE语句 - 可能无效,稍后还需要更多工作
  • 在音乐表上创建全文索引并省略该类型 - 不够好
  • 创建一个类似于连接的新表,并在每天的基础上填写一份工作(或类似的东西)a在该表上进行全文搜索 - 长期的最佳解决方案,但还有更多工作要开始使用并包含数据双重性

您还必须记住,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>";
}