我需要一些查询。
CREATE TABLE `location_areas_localized` (
`id` int(11) DEFAULT NULL,
`lang_index` varchar(5) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
KEY `id` (`id`),
KEY `lang_index` (`lang_index`),
KEY `name` (`name`),
FULLTEXT KEY `name_2` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `location_areas_localized` (`id`, `lang_index`,`name`)
VALUES
(1,'ru','Нью Йорк'),
(1,'en','New York'),
(2,'en','Boston'),
(2,'ch','波士顿')
;
搜索逻辑。
如果找到lang_index='ru' AND id IN(1,2)
行。必须使用lang_index='ru'
返回所有内容
如果lang_index='ru'
不存在的一行或多行但存在lang_index='en'
且带有一些ID。
然后它必须返回land_index='ru' AND id IN(1,2)
所有存在的所有内容以及lang_index='ru'
找不到但lang_index='en'
找到的所有内容(在表格中 - 所有lang_index='en'
行始终存在)
每个id我只需要一个结果。我尝试过GROUP BY id,但它无法正常工作。
输出必须
1,'ru','Нью Йорк'
2,'en','Boston' (because lang_index='ru' with id 2 not found)
答案 0 :(得分:1)
SELECT
coalesce(max(CASE WHEN lang_index='ru' THEN name ELSE null END), name) as name
FROM
location_areas_localized
WHERE
id IN (1,2)
AND (lang_index='en' OR lang_index='ru')
group by
id
ORDER BY
FIELD(lang_index,'ru','en');
答案 1 :(得分:0)
不使用聚合函数,只需要第一个匹配的行。带有ORDER BY
的子查询强制执行以下事实:对于相同的id
,“ru”(或“en”,如果“ru”不存在)行是第一个。
SELECT *
FROM(
SELECT *
FROM location_areas_localized
ORDER BY FIELD(lang_index,'ru','en','ch')
) as inv
WHERE id IN (1,2)
GROUP BY id
请参阅SQLFiddle示例