1

mysql php でオートコンプリート用のクエリを書きたいです。2 つのテーブルがあります。

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) で検索されます...1 つのフィールドで結果を返したいとします。たとえば、「RAK」と入力すると、エリア テーブルで検索されます。見つかった場合は、city_id と area_name が返されます。それ以外の場合は、city.i で検索されます。cityid 、areaid、および一致したテキストを取得する必要があります。

4

4 に答える 4

1

ORがあると、両方のテーブルでテーブル スキャンが発生します。aUNIONを使用すると、インデックスを使用できます。

    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;
于 2013-03-12T19:41:14.813 に答える
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>;

テストするにはフィドルを作成する必要がありますが、ある結果を別の結果に「フェイルオーバー」するという概念があります。

于 2013-03-12T18:42:31.710 に答える
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%'
于 2013-03-12T18:47:35.580 に答える
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一致が都市名のみであった場合は null になります。

于 2013-03-12T19:47:22.360 に答える