Mysql 使用基于其他字段的首选项分组

Mysql 使用基于其他字段的首选项分组,mysql,sql,Mysql,Sql,有没有一种方法可以让一组人在一个字段中记录一个特定的值,但givinig更重要 例如: value - language - externID 1 default 10 1 english 10 2 english 10 3 default 10 选择结果: 1 - english - 10 2 - english - 10 3 - default - 10 IE:如果有具有相同“值”的记录,则更喜欢

有没有一种方法可以让一组人在一个字段中记录一个特定的值,但givinig更重要

例如:

value - language - externID
1       default      10
1       english      10

2       english      10

3       default      10
选择结果:

1 - english - 10
2 - english - 10
3 - default - 10
IE:如果有具有相同“值”的记录,则更喜欢具有“英语”的记录

示例:从tbl中选择*,其中externID=10,并根据值“preference lang=english”在('default','english')组中选择语言


ps.“english”是我需要的一个例子,我可以在两种语言之间选择具体的语言

为english指定一个低于默认值的值,或者将默认值设置为荒谬的高,然后对新名称(例如language_值)进行排序,然后对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

基于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

这比任何“其他”都低。

在另一个问题上,是123增加了一点额外的

如果首选语言为中文,且某个值与默认值和英文关联,则该值不应返回任何结果

我理解它的意思是

  • 如果组包含搜索到的语言,则返回该语言
  • 如果组不包含该语言,但仅包含默认值,则返回默认值
  • 如果组不包含该语言,但包含非默认语言,则不返回任何内容

HAVING子句只是声明该值的每个记录必须是“default”或您正在搜索的语言


子查询中的ORDER BY和LIMIT 1强制最后(始终)选择“default”。也就是说,如果找到了首选语言,则会显示在首选语言中。

可能重复您为什么再次发布此问题?我之所以再次发布此问题,是因为我重新编制了我的问题,最好在新问题中解释,并删除您原来的帖子。我明白编辑原文是毫无意义的,因为没有人会看老问题。@andromar:我不能删除,因为有答案。。虽然这可能对Somononet有所帮助,但这里有一个假设,即如果“首选语言”是汉语,那么应该返回什么。对于value=1的记录,它应该返回默认值还是英语?(这是一个小时前他发布的问题的OP提问。)@Dems:在答案中添加了一些变体。。。这个问题看起来像是在重复:)这个简单任务的所有东西都太棒了?@yes123:好吧,希望有人能给出一个更简洁的答案,我能学到一些东西:)你的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near'case as langValIt的正确语法应该是“end as langVal”。为自己搜索谷歌是不是太难了?Thyamine可能会将其与另一个DB的语法混淆。但是,我强烈建议您尝试理解提供给您的解决方案,并为自己付出一些努力。如果我不太熟悉sql query,请原谅。无论如何,现在没有错误,但是查询返回默认值和英语(甚至多次重复记录)
select lang,portalid,case when lang='en',然后1 when lang='defat',然后100从mlink以langVal结尾,其中portalid=1243 order by langVal
@tombom感谢您将其添加进来。我查看的MySQL文档显示“end case as…”而TSQL只是“end as…”@yes123如果你需要一个“groupby”,那么当然可以添加它。我给+1,但这与group不起作用,抱歉,我接受另一个答案,我接受这个答案,因为这是唯一一个似乎能满足我要求的查询,但是我并没有用这么大的查询来完成这个简单的任务。我更喜欢用php解析结果并删除不需要的记录。无论如何,谢谢。请小心,不要因为希望在不同的域中处理数据而造成不必要的开销。事实上,数据驻留在一个系统中,应用程序驻留在另一个系统中。即使它们在同一台服务器上,传输所有数据然后在PHP中处理也可能没有特别好的性能。我们需要用SQL来表现它的长处,用PHP来表现它的长处。PHP不擅长处理大量数据。简言之,我个人只会在PHP中这样做,如果您知道数据集总是很小的话。[我怀疑PHP代码会更短]@dems:PHP代码少于4-5行代码,如果你想看的话,告诉我。是的,通常值都很低,所以PHP速度不是问题。我很想看到PHP代码,总是渴望学习新东西!这里:它需要2个数组、$cache和$cleanedResult。你可以了解他们是如何使用xD的
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)