我已经寻找解决这个问题的方法,有些很接近,但似乎找不到解决方案。我有一个包含各种信息的"运行"表,其中一列是有关它所适用的公司的信息。我还有一个公司表,存储公司的所有信息。在运行表的公司列中,公司由公司表中的"索引器"标识。
现在我有一个搜索,您可以在其中搜索有关运行的任何信息,以查找包含搜索短语的任意数量的记录,包括公司。作为运行表的公司列,只有标识符号,即。34、23、5 等 我还需要检查公司表名称列中的匹配项。
这是我的查询,如果只有一家公司与搜索结果匹配,则效果很好。我需要返回所有匹配的公司。
$sql_results = "SELECT * FROM runs WHERE name LIKE '%$searchname%' OR company = (SELECT indexer FROM companies WHERE name LIKE '%$searchname%' ) OR feild LIKE '%$searchname%' ORDER BY date_due";
while($result_results = @mysql_fetch_array($query_results))
{
$resultnm_array[]=$result_results['name'];
$cmp_id = $result_results['company'];
$sql2 = "SELECT name FROM companies WHERE indexer = '$cmp_id' LIMIT 1";
$query2 = @mysql_query($sql2);
$result2 = @mysql_fetch_array($query2);
$resultcpy_array[]=$result2['name'];
$resultfld_array[]=$result_results['feild'];
$resultdt_array[]=$result_results['date_due'];
$resultid_array[]=$result_results['indexer'];
}
我正在将结果输入到数组中并使用TBS模板引擎创建结果表等。我有点新手,所以任何帮助将不胜感激。从我收集的信息来看,我需要使用连接。但我似乎无法让它工作...
您不能只使用IN
:
SELECT *
FROM runs
WHERE name LIKE '%$searchname%'
OR company IN (
SELECT indexer
FROM companies
WHERE name LIKE '%$searchname%' )
OR feild LIKE '%$searchname%'
ORDER BY date_due
鉴于您的评论:"如果只有一家公司与搜索结果匹配,则工作正常" - 这让我相信如果多家公司符合搜索条件,查询会因=
而失败。
鉴于您的编辑,您可以使用JOIN
简化此操作,并且不再需要循环中的其他 select 语句:
SELECT r.*, c.name
FROM runs r
JOIN companies c on r.company = c.indexer
WHERE r.name LIKE '%$searchname%'
OR r.feild LIKE '%$searchname%'
ORDER BY r.date_due