我正在尝试让我的网站搜索框能够在一个查询中搜索多个表。
因此,如果用户搜索存储在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
有人可以告诉我哪里出错了吗?
答案 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());
预防和诊断此类错误。