具有基于另一个FIELD的首选项的GROUP BY

时间:2011-02-25 15:03:10

标签: mysql sql

有没有办法做一个小组但是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。 “英语”是我需要的一个例子我可以选择不同的特定语言

3 个答案:

答案 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”。这意味着,如果找到首选语言,则会显示首选语言。