如果是第一个选择马赫则选择行,如果没有,则移动到下一个选择

时间:2016-04-24 13:46:08

标签: mysql

我有1个包含名称和语言列的表。

我们说我有2种语言,ID为1和2 我想选择语言= 2的所有名称,如果语言= 2中没有任何行,那么我将选择具有语言1的名称。如果语言= 2不可用,则只获取语言= 1的行

ID language name(as code)
1  1        name_1
2  2        name_1
3  1        name_2

我想得到这样的东西:

ID language name
1  2        name_1
3  1        name_2

感谢您的帮助。对不起我的英文

3 个答案:

答案 0 :(得分:1)

我认为您希望语言1(默认值)的所有行都使用语言2的值(仅当我存在时),所以:

表格:

create table `lang`
(
    id int,
    lang_id int,
    name varchar(20),
    description varchar(255)
);

一些数据:

insert into `lang` (id, lang_id, name, description) values
(1, 1, 'language', 'English'),
(2, 2, 'language', 'Português'),
(3, 1, 'title', 'My Project'),
(4, 2, 'title', 'Meu Projeto'),
(5, 1, 'var1', 'My English only variable');

查询:

select 

c1.name, coalesce(c2.description, c1.description) as description

from lang c1

left join lang c2 on c1.name = c2.name and c2.lang_id = 2

where c1.lang_id = 1 

结果:

name     | description
language | Português
title    | Meu Projeto
var1     | My English only variable

<强> SQL Fiddle

答案 1 :(得分:0)

你开车写这样的查询:

SELECT ......
FROM mytable
WHERE ........ (without languageID)
ORDER BY languageID DESC (if you want to have 2 else ASC)
LIMIT 1;

所以如果存在其他1或0

,它只会选择laguageID 2

一个样本

SELECT ......
FROM mytable
WHERE ........ (without languageID)
ORDER BY ELT(languageID,'1','0','4','3');

数字IN elt是订单ID。让我们说你想让LANGUAGEid 2 AS FIRST把最低的NO IN字段2 LIKE 0

答案 2 :(得分:0)

你的答案是这样的。

select *
from   t
where  language = 2
union
select *
from   t
where  language = 1 
       and 0 in (select count(1) 
                 from   t
                 where  language = 2)

第一个选择使用language = 2获取所有名称

如果没有language = 2

的任何名称,则第二个选择使用language = 1获取所有名称