关键字搜索,多表,PHP和Mysql,哪个加入使用?

时间:2009-07-07 13:52:39

标签: php mysql search join

我有3个表事件,位置,event_location。活动可以有多个位置。 位置表具有lattitude,longitude,hasGeocode字段。

所以对于关键词“hello world”

对事件表的简单查询变为

Select * from event where keywords like '%hello%' OR keywords like '%world%'

但是如果用户输入了他们的位置,那么我也希望在此查询中包含位置表,以便用户可以指定他们选择的位置,我该怎么做?

基本上有3种类型的搜索查询

  • 只是关键字

  • 关键字和位置

  • 关键字,距离和位置

我尝试过这样的事情 -

   select * from event where keywords like '%hello%' OR
   keywords like '%world%' INNER JOIN location ON 
   location.location_id = event_location.location_id 
   INNER JOIN 
   event_location ON event_location.event_id = event.event_id

INNER JOIN表示事件必须有一个或多个位置。如果事件没有任何位置,它将不会出现在搜索结果中。所以请帮帮我,我该怎么做?

谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

你的连接语法都被破坏了。在任何情况下,如果内部连接没有切割它,请使用外部连接。 ; - )

SELECT
  *
FROM
  event AS e
  LEFT JOIN event_location AS el ON el.event_id = e.event_id
  LEFT JOIN location       AS  l ON l.location_id = el.location_id
WHERE
  e.keywords LIKE '%hello%' 
  OR e.keywords LIKE '%world%' 

此外,使用表别名绝不是一个坏主意,特别是如果你的表名很长。

答案 1 :(得分:1)

使用LEFT JOIN s(我更改了联接的顺序并修复了where子句位置,这是错位的)

select * from event LEFT JOIN event_location ON 
event.event_id = event_location.event_id 
LEFT JOIN 
location ON event_location.location_id = location.location_id
where keywords like '%hello%' OR
keywords like '%world%' 

这样,对于没有位置的事件,你将获得NULL。

另外,尽量不要使用select *,而是命名您感兴趣的列。