将数据库中不同的表查询与PHP结合起来,并在一个页面上显示所有结果


Combining different table queries in db with PHP and displaying all results on one page

我一直在尝试创建一个有趣的数据库,以更好地了解数据库,并使用PHP查询他们的网站,我正在搞乱。当用户在PHP搜索框中输入搜索词时,我的代码搜索数据库中包含搜索词的任何条目。现在我可以很容易地让我的代码搜索单个表,但我似乎不能让它搜索所有4个表并在同一页面上显示结果。

info:为skyrim制作数据库

  • 表名:职业、能力、技能、呼喊
  • 列名:名称、信息

下面是目前为止我所拥有的代码片段:

$raw_results = mysql_query("
   SELECT *
   FROM   `xaviorin_skyrim`.`shouts` , `xaviorin_skyrim`.`classes`
   WHERE  (CONVERT(`UID` USING utf8) LIKE '%".$query."%' OR
          CONVERT(`Name` USING utf8) LIKE '%".$query."%' OR 
          CONVERT(`Information` USING utf8) LIKE '%".$query."%')
") or die(mysql_error());`

从字面上看,我认为我需要做的就是在新的raw_results行代码中将表名从"呼喊"改为"类",但这不起作用。我尝试过联合和连接,要么把它们搞砸,要么就是不明白如何正确格式化它们。

echo "<p><h3>".$results['Name']."</h3>".$results['Information']."</p>";

这个文本上面的代码是什么显示在我的网站的页面上的结果…它的工作原理,但我不知道如何从所有4个表的信息组合成一页。如果我做错了,有人能给我指出正确的方向,我会非常感激……这个问题我已经研究了将近一个月了,但没有找到合适的答案。

您的方法的问题是,当有来自两个不同表的多个查询结果时,关系数据库会执行交叉连接。基本上一个表中的每一个匹配都会和第二个表中的每一个匹配结合起来。当第一个表中有3个条目,第二个表中有4个条目时,您将在查询结果中获得3 * 4 = 12项。如果添加更多的表,就会得到更多的结果。您想要在几个完全不相关的表中进行全文搜索,因此通过交叉连接它们来创建某种不存在的关系是没有用的。

您实际要做的是几个查询的UNION ALL (UNION较慢,因为它修剪重复):

SELECT name, information, 'shouts' AS tablename FROM shouts WHERE ...
UNION ALL
SELECT name, information, 'classes' AS tablename FROM classes WHERE ...

这将对每个单独的表进行搜索查询,然后将结果放在单个结果中。还请注意,我在每个查询中添加了第三列,以确保合并结果后不会丢失原始表。

除非您需要在之后进行一些排序,否则我建议您单独执行所有语句。以这种方式组合它们很可能会使后处理更加复杂。几个单个查询也会比一个使用UNION语句的大查询快。

正如我在评论中提到的:不要使用mysql_*函数!