【问题标题】:Join Query for autocomplete in mysql在mysql中加入查询以进行自动完成
【发布时间】:2013-03-13 03:47:22
【问题描述】:

我想在 mysql php 中为自动完成编写一个查询。我有两个表

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 ;

table2 是

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”,它将在area table.if 找到它将返回 city_id 和 area_name 否则它将在 city.i 中搜索。我需要获取 cityid , areaid 和匹配的文本。这是怎么回事?

【问题讨论】:

  • 所以根据命中是在“区域”还是“城市”返回不同的列数?
  • 我想在一列中显示 area_name 和 city_name...如果 area_name 不匹配,则应在 city_name 中搜索并返回在同一列中匹配的..
  • area.city_id 和 city.id 有关系吗?
  • 是的,这是主键和外键......它们是链接的......
  • 我想像这样返回..[{"id":"12","value":"Arabian Ranches"........}]....现在值可能是 area_name(如果成功)或 city_name

标签: mysql join autocomplete


【解决方案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;

【讨论】:

    【解决方案2】:

    你可以使用这个查询

    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%'
    

    【讨论】:

    • 如果从任一表中找到它肯定会发送成功
    • 这给了我那些不包含搜索词的记录的结果
    【解决方案3】:

    你可以从这样的开始:

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

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

    【讨论】:

    • 我们不需要使用 ifnull ......我们需要检查是否命中/找到或搜索成功
    • 如果未找到,第一个术语将为空 - 因此它将使用第二个术语。
    【解决方案4】:
    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 将为空。

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      相关资源
      最近更新 更多