0

クエリが必要です。

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' 1つ以上の行が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ごとに必要な結果は1つだけです。GROUP BY idを試しましたが、正しく機能しません。

出力は

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

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

2 に答える 2

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');
于 2013-01-18T09:02:53.810 に答える
0

集計関数を使用せずに、最初に一致する行のみを取得します。サブクエリは、同じ場合、「ru」(または「ru」が存在しない場合は「en」)行が最初の行であるORDER BYという事実を強制します。id

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の例を参照してください

于 2013-01-18T08:57:44.973 に答える