将多个查询连接到具有不同列数的表

时间:2015-01-26 01:20:33

标签: php mysql sql

所以我有3个名为hostseventsseries的表。

hosts包含4列:id,name,website,region

events包含3列:id,host,name

series包含9列:id,date,bestof,host,event,teamA,teamB,comment

我有一个搜索框,目前使用teamA和teamB列搜索数据库。它有效,但我想通过允许用户输入主机名和事件名来打开标准。

Say series有一行包含名为“goodTeam”和“bestTeam”的teamA和teamB字段,hosts有两行名称为“FIFA”和“NFL”,events有两行名称为“英超联赛”和“超级碗”。

截至目前,如果我搜索“goodTeam”,它将在“英超联赛”和“NFL”两项赛事中为该球队提供所有比赛。我希望能够搜索“goodTeam nfl”,它只会返回NFL中goodTeam比赛的结果,或者进一步改进它,我搜索“goodTeam nfl super bowl”并且它只返回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 . "%'";

感谢。

1 个答案:

答案 0 :(得分:1)

好的,您将需要使用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)或者如果你发现事情变慢,我建议在系列表中使用额外的'关键字'字段或类似字段,而不是每次都进行连接。添加行时生成关键字列表,然后您只需对该字段执行任何查找。