因此,我有3个名为hostseventsseries的表。

hosts包含4列:ID,名称,网站,区域

events包含3列:id,主机,名称

series包含9列:id,日期,bestof,主持人,事件,teamA,teamB,评论

我有一个搜索框,此刻,使用teamA和teamB列搜索数据库。它可以工作,但是我想通过允许用户输入主机名和事件名来打开条件。

假设series的一行包含名为“ goodTeam”和“ bestTeam”的teamA和teamB字段,hosts的两行名为“ FIFA”和“ NFL”,而events的两行则命名为“ Premier League”和“超级碗”。

到目前为止,如果我搜索“ goodTeam”,它将为“ Premier League”和“ NFL”两个赛事提供该队的所有比赛。我希望能够搜索“ goodTeam nfl”,它只会从NFL中的goodTeam比赛中返回结果,或者进一步完善它,我会搜索“ goodTeam nfl超级碗”,并且它仅从goodTeam中返回比赛,在NFL超级碗赛事中。

如果很难理解,我深表歉意。我已尽力解释我要做什么。我尝试将现有列设置为NULL的UNION ALL,但我认为我做错了,因为它从符合条件的hosts表而不是series表返回所有符合条件的内容需要。

$sql = "SELECT
    id as host,
    null as date,
    null as id,
    null as bestof,
    null as event,
    null as teamA,
    null as teamB,
    null as comment,
    name,
    region
FROM hosts WHERE name LIKE '%" . $term . "%'
UNION ALL
SELECT
    host,
    date,
    id,
    bestof,
    event,
    teamA,
    teamB,
    comment,
    null as name,
    null as region
FROM series WHERE teamA LIKE '%" . $term . "%' OR teamB LIKE '%" . $term . "%'";


谢谢。

最佳答案

好的,您将需要使用JOIN语句。由于看起来您只是在series表中寻找结果,因此可以像这样跨表联接:

SELECT series.* FROM series
LEFT JOIN events ON series.event=events.id
LEFT JOIN hosts on events.host=hosts.id


现在,您正在寻找一个多关键字搜索,要求从几列中的每一个关键字至少匹配一个匹配项。这将需要一个迭代生成的WHERE查询。对于两个关键字的示例,您将具有:

SELECT series.* FROM series
LEFT JOIN events ON series.event=events.id
LEFT JOIN hosts on events.host=hosts.id
WHERE (series.teamA LIKE '%goodTeam%' OR series.teamB LIKE '%goodTeam%' OR events.name LIKE '%goodTeam%' OR hosts.name LIKE '%goodTeam%')
AND (series.teamA LIKE '%nfl%' OR series.teamB LIKE '%nfl%' OR events.name LIKE '%nfl%' OR hosts.name LIKE '%nfl%')


这对于小型数据库很好,但是效率不是很高。如果您将要有很多行(> 50,000)或发现速度变慢,建议您在系列表中使用额外的“关键字”字段或类似字段,而不是每次都进行联接。添加该行后,生成关键字列表,然后您可以对该字段执行任何查找。

关于php - 将多个查询联接到具有不同列数的表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28143566/

10-11 22:01