Mysql的。使用IF选择field = 1或field = 2的位置

时间:2013-01-18 08:27:28

标签: mysql sorting if-statement

我需要一些查询。

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'行始终存在)

sqlfiddle

每个id我只需要一个结果。我尝试过GROUP BY id,但它无法正常工作。

输出必须

  1,'ru','Нью Йорк'

   2,'en','Boston'   (because lang_index='ru' with id 2  not found)

2 个答案:

答案 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示例