5

我有一个包含这些值的表:“user_id、text、text_lang、user_lang”。

字段 text_lang 包含表示文本语言的区域设置快捷方式('en'、'de')。我现在想通过选择每个 user_id 出现次数最多的 text_lang 来设置(未知/空)“user_lang”。

我有一个有效的 select 语句,它返回每个 user_id 出现次数最多的 text_lang,但我不知道如何根据 ID 更新每行的 user_lang。

SELECT user_id, text_lang
FROM (
    SELECT  user_id,
        text_lang,
        max(text_lang_count) OVER (PARTITION BY user_id) max_count,
        text_lang_count
    FROM (
        SELECT  user_id,
                text_lang,
                COUNT(text_lang) AS text_lang_count
        FROM test
        GROUP BY user_id, text_lang
    ) AS xx
) AS xy
WHERE tweet_lang_count = max_count

我假设(但不确定)MySQL/SQL: Update with related subquery from the updated table 本身包含与我的问题密切相关的内容,但我无法使该解决方案适应这个特定问题。

4

2 回答 2

7

SQL小提琴

with lang as (
    select distinct on (user_id)
        user_id, text_lang, text_lang_count
    from (
        select
            user_id,
            text_lang,
            count(text_lang) as text_lang_count
        from t
        group by user_id, text_lang
    ) s
    order by 1, 3 desc, text_lang != 'en' -- in a tie english wins
)
update t
set user_lang = lang.text_lang
from lang
where t.user_id = lang.user_id

计算 CTE ( with) 中的主要语言并在from子句中使用

于 2013-05-30T15:02:17.477 回答
2

PostgreSQL 中的相关更新具有与 MySQL 不同的语法。可以这样写:

UPDATE tablename T
 SET user_lang=subquery.text_lang
 FROM ( SELECT user_id,text_lang FROM... etc... ) subquery
 WHERE T.user_id=subquery.user_id

其中子查询正是您在问题中的 SELECT 查询。

不过,以上是非标准的。符合 SQL 标准的形式如下:

UPDATE tablename T
 SET user_lang=(SELECT text_lang FROM ... WHERE... AND user_id=T.user_id)

但使用这种形式,您将不得不重塑您的初始查询以计算所需text_lang的仅一个特定的user_id.

于 2013-05-30T14:43:23.550 回答