有没有办法做一个小组但是givinig更重要的是记录在某个领域有特定价值?
示例:
value - language - externID
1 default 10
1 english 10
2 english 10
3 default 10
SELECT的结果:
1 - english - 10
2 - english - 10
3 - default - 10
IE:当存在具有相同“值”的记录时,更喜欢带有“英语”的记录
示例:SELECT * FROM tbl WHERE externID = 10 AND语言IN('default','english')GROUP BY值“PREFER lang = english”
PS。 “英语”是我需要的一个例子我可以选择不同的特定语言
答案 0 :(得分:3)
您可以使用case语句:
http://dev.mysql.com/doc/refman/5.0/en/case-statement.html
给一个低于默认值的英语值,或者使默认值非常高,然后对该新名称(例如language_value)进行排序,然后对externID进行排序。
select language, enternalID,
case
when language = 'english' then 1
when language = 'default' then 100
end case as langVal
from tableName
order by langVal, externalID
答案 1 :(得分:0)
基于Thyamine的想法,您可以使用where
子句,该子句说当前行的语言是该组的最佳语言:
select value
, language
, externID
from YourTable t1
where case language when 'English' then 3 when 'default' then 2 else 1 end =
(
select max(case language when 'English' then 3
when 'default' then 2 else 1 end)
from YourTable t2
where t1.value = t2.value
and t1.language = t2.language
and t1.externID = t2.externID
)
group by
value
, language
, externID
如果既未找到特定语言也未找到默认值,则不返回任何行,请使用:
case language when 'English' then 3 when 'default' then 2 else null end
由于null = null
不真实,因此与where子句不匹配。
对于优先于默认语言的通用版本,请使用:
case language when 'default' = 1 else 2 end
此费率默认低于“其他”。
答案 2 :(得分:0)
在另一个问题上,Yes123增加了一点......
如果首选语言是中文,并且值与默认和英语相关,则该值应该没有返回结果......
我理解这意味着......
DECLARE
@preferred VARCHAR(64)
SET
@preferred = 'English'
SELECT
value,
(
SELECT
language
FROM
tbl [search]
WHERE
externID = 10
AND value = tbl.value
AND language IN ('default', @preferred)
ORDER BY
NULLIF(language, 'default') DESC
LIMIT
1
)
FROM
tbl
WHERE
externID = 10
GROUP BY
value
HAVING
COUNT(*) = SUM(CASE WHEN language IN ('default', @preferred) THEN 1 ELSE 0 END)
HAVING子句只是声明该值的每个记录必须是“默认”或您正在搜索的语言。
子查询中的ORDER BY和LIMIT 1强制始终选择“default”。这意味着,如果找到首选语言,则会显示首选语言。