2013-03-12 63 views
1

我要为autocomplete.i有两个表连接查询的自动完成功能在MySQL

CREATE TABLE IF NOT EXISTS `city` (
`id` int(22) NOT NULL AUTO_INCREMENT, 
`city_name` varchar(44) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=64 ; 

和表2写在MySQL PHP查询是

CREATE TABLE IF NOT EXISTS `area` (
`id` int(22) NOT NULL AUTO_INCREMENT, 
`city_id` int(44) NOT NULL, 
`area_name` varchar(33) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2561 ; 

当用户输入任何内容,它会搜索在区域表(area_name)和城市表(city_name)中...我想在一个字段中返回结果。例如,如果您键入“RAK”,它将在区域table.if中搜索,如果发现它将返回city_id和area_name否则它会在city.i中搜索需要获取cityid,areaid和匹配的文本。这可以吗?

+0

使用UNION查询 – ethrbunny 2013-03-12 18:25:37

+0

,因此根据命中是在“区域”还是“城市”中返回不同的列数? – ethrbunny 2013-03-12 18:32:50

+0

我想在一列中显示area_name和city_name ...如果area_name不匹配,则应在city_name中进行搜索并将返回匹配在同一列中。 – Methew 2013-03-12 18:33:50

回答

1

具有OR子句将导致两个表中的表扫描。使用UNION将允许使用索引:

SELECT 
     city_id, 
     id AS area_id, 
     area_name AS name, 
    FROM 
     area 
    WHERE 
     area_name LIKE 'searchterm%' 
UNION 
    SELECT 
     id AS city_id 
     NULL AS area_id, 
     city_name AS name 
    FROM 
     city 
    WHERE 
     city_name LIKE 'searchterm%' 
ORDER BY 
    name; 
+0

谢谢先生你解决了它 – Methew 2013-03-12 19:58:51

0

你可能有这样的事情开始:

select ifnull(area_name, city_name) from area 
    join city on area.city_id = city.id  
    where area_name = <name> or city_name = <name>; 

我需要建立一个小提琴测试,但“故障转移”的概念,一个结果到另一个是存在的。

+0

我们不需要使用ifnull ...我们需要检查命中/搜索或搜索成功 – Methew 2013-03-12 19:02:58

+0

如果不是,则第一项将为空发现 - 所以它会使用第二个词代替。 – ethrbunny 2013-03-12 19:23:53

+0

不工作...显示无与伦比的记录也 – Methew 2013-03-12 19:38:14

0

您可以使用此查询

SELECT 
    IF(city_name IS NULL ,area_name , city_name) as `Area` 
FROM city AS c 
LEFT JOIN area AS a ON a.city_id = c.id 
WHERE city_name LIKE 'keyword%' OR area_name LIKE 'keyword%' 
+0

好吧,它肯定会发送成功,如果发现从任何表 – 2013-03-12 19:23:02

+0

这给我那些记录也不包含搜索词的结果 – Methew 2013-03-12 19:35:45

0
SELECT 
    c.id, c.city_name, a.id, a.area_name 
FROM 
    city AS c 
LEFT OUTER JOIN area AS a ON a.city_id = c.id 
WHERE c.city_name LIKE 'input%' 
    OR a.area_name LIKE 'input%' 

a.ida.area_name将是无效的,如果比赛是唯一的城市的名字。