joinしたテーブルに対して、特定のカラムの検索条件がない場合は、同じカラムへの違う条件で検索したい
以下のような二つのテーブルが存在します。
CREATE TABLE `tableA` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`uuid` varchar(255) ,
`geo_latitude` decimal(10,7) DEFAULT NULL COMMENT 'スポット緯度',
`geo_longitude` decimal(10,7) DEFAULT NULL COMMENT 'スポット経度',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (id)
) DEFAULT CHARSET = utf8;
CREATE TABLE `tableB` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`tableA_id` bigint(20) DEFAULT NULL ,
`language_code_id` int(11) DEFAULT NULL,
`value` text NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (tableA_id) REFERENCES tableA (id)
) DEFAULT CHARSET = utf8;
tableAとtableBの関係は、tableAが基本となる情報を保持しているのですが、このtabelAの多言語の情報をtableBが保持するようになっています。また、tabelAが保持するtableBの多言語情報は基本的に不定なのですが、日本語(languagecode=1)は必ず持つような作りになっています。
このような状況の中で、特定の緯度経度から近い物を検索して、指定された言語コードのvalueを取得,
もし指定の言語がなければ日本語を取得するというsqlを実行したいです。
現状緯度経度部分のsqlはかけているのですが、”指定された言語コードのvalueを取得,
もし指定の言語がなければ日本語を取得”という部分のクエリがかけていないです。
ご教授いただけると幸いです。
ちなみに環境はMySQLです。
--現状のクエリ--
SELECT
tableA.id, tableA.uuid, geo_latitude AS latitude, geo_longitude AS longitude, ( 6371000 * acos( cos(radians(35.730)) * cos(radians(geo_latitude)) * cos(radians(geo_longitude) - radians(139.831)) + sin(radians(35.730)) * sin(radians(geo_latitude)) ) ) AS distance,
`tableB`.`language_code_id`, `tableB`.`value`
FROM tableA
INNER JOIN `tableB` ON tableA.id = `tableB`.`tableA_id`
HAVING distance <= 100.0
ORDER BY distance;
--tableAテストデータ---
INSERT INTO `tableA` (`id`, `uuid`, `geo_latitude`, `geo_longitude`, `created_at`, `updated_at`)
VALUES
(1,'f4975f27-e07a-4389-b615-a566fa66ba08',35.730,139.830,'2019-04-17 11:47:49','2019-04-17 11:47:49'),
(2,'f4975f27-e07a-4389-b615-a566fa66ba09',35.7301,139.8301,'2019-04-17 11:47:49','2019-04-17 11:47:49'),
(3,'f4975f27-e07a-4389-b615-a566fa66ba10',35.7302,139.8302,'2019-04-17 11:47:49','2019-04-17 11:47:49'),
(4,'f4975f27-e07a-4389-b615-a566fa66ba11',35.7303,139.8303,'2019-04-17 11:47:49','2019-04-17 11:47:49'),
(5,'f4975f27-e07a-4389-b615-a566fa66ba11',35.734,139.834,'2019-04-17 11:47:49','2019-04-17 11:47:49');
--tableBテストデータ--
INSERT INTO `tableB` (`id`, `tableA_id`, `language_code_id`, `value`, `created_at`, `updated_at`)
VALUES
(1,1,1,'テストデータ1_日本語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(2,1,2,'テストデータ1_英語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(3,1,3,'テストデータ1_中国語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(4,2,1,'テストデータ2_日本語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(5,2,2,'テストデータ2_英語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(6,3,1,'テストデータ3_日本語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(7,4,1,'テストデータ4_日本語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(8,4,2,'テストデータ4_英語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(9,4,3,'テストデータ4_中国語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(10,4,4,'テストデータ4_韓国語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(11,5,1,'テストデータ5_日本語','2019-04-17 11:49:00','2019-04-17 11:49:00'),
(12,5,4,'テストデータ5_韓国語','2019-04-17 11:49:00','2019-04-17 11:49:00');
-- language_code_id対応表 ---
id 言語
1 日本語
2 英語
3 中国語
4 韓国語
5 タイ語
上記のテストデータの場合、やりたいことは
条件は35.730,139.830の地点より100m以内にあるもの
取得したいデータは
tableAの各カラムと、検索地点からの取得データまでの距離、
tableBのvalueなのですが、中国語のvalueが欲しいのだけれど、中国語がない場合は日本語が欲しい。
という事になります。
この場合取得したいデータ(tableAの各カラムは省略しています)は
tableA.id, tableB.language_code_id, tableB.value
1, 3, 'テストデータ1_中国語'
2, 1, 'テストデータ2_日本語'
3, 1, 'テストデータ3_日本語'
4, 3, 'テストデータ4_中国語'
になります。