分组或加入搜索查询?

时间:2012-12-10 20:54:20

标签: php mysql

我正在尝试让我的网站搜索框能够在一个查询中搜索多个表。

因此,如果用户搜索存储在display_name中的用户ptb_profiles,他们会获得具有匹配名称的任何用户,或者如果他们按照ptb_stats中存储的国籍进行搜索,则会获得显示所有具有该国籍的用户。

当我最初使用SELECT * FROM ptb_users, ptb_stats, ptb_profiles执行此操作时,我得到了重复的搜索结果,并且多次显示相同的结果,因此我尝试避免这种情况,并且每个结果仅通过分组和使用union all显示一次但那没用。

现在我试过这个:

$query_for_result=mysql_query("SELECT display_name, location, gender, contact_number FROM ptb_profiles WHERE display_name LIKE '%".$query."%' OR location LIKE '%".$query."%' OR gender LIKE '%".$query."%' OR contact_number LIKE '%".$query."%' JOIN SELECT email, subscription FROM ptb_users WHERE email like '%".$query."%' OR subscription like '%".$query."%' JOIN SELECT nationality, hobbies, local_station FROM ptb_stats WHERE nationality like '%".$query."%' OR hobbies like '%".$query."%' OR local_station like '%".$query."%' 
        LIMIT 5");

但这只会出现以下错误:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /Applications/XAMPP/xamppfiles/htdocs/PTB1/includes/mod_sidebar/search.php on line 31

有人可以告诉我哪里出错了吗?

2 个答案:

答案 0 :(得分:0)

这不是唯一的方法。但是,如果将GROUP BY应用于查询,则可以在多个联接表上进行搜索并轻松获取不同的用户列表。假设您的所有表都通过ID列相关,那么这可能会起作用......

SELECT u.* FROM ptb_users u
INNER JOIN ptb_stats s ON s.user_id=u.id
INNER JOIN ptb_profiles p ON p.user_id=u.id
WHERE "this or that"
GROUP BY u.id

如果用户可能没有ptb_stats或ptb_profiles中的记录,请将您的联接更改为LEFT JOINS ...

答案 1 :(得分:0)

mysql_fetch_array()抱怨$query_for_result不是查询结果。 您必须检查mysql_query()的返回值。如果您的SQL语句存在问题,则返回false。所以至少

$sql = "select ...";
$result = mysql_query($sql) or die("Error in $sql: " . mysql_error());

预防和诊断此类错误。