繁体   English   中英

使用选择数据更新查询

[英]Update query using select data

请先看看我的桌子:

[user_id,row_id,row_value]-表格:users_data

内容:

row_id 1:

[1, 1, 1]
[2, 1, 2]
[3, 1, 2]
[4, 1, 2]

row_id 2:

[1, 2, 1]
[2, 2, 1]
[3, 2, 1]
[4, 2, 1]

row_id 3:

[2, 3, 5]
[2, 3, 5]
[2, 3, 5]

我想找出是否有可能仅通过使用MySQL语言自动执行这3个步骤:

步骤1:获取user_id = 1的row_id的列表(所以[ row_id ]和[ row_id ])

步骤2:遍历该列表,找出从步骤1获得的列表中row_ids最流行的row_values

步骤3:遍历步骤2的结果,以使user_id = 1的row_value与大多数流行的row_values相同。

现在多数民众赞成我查询:

第1步:

SELECT row_id FROM users_data WHERE user_id = 1;

该查询的结果为2行:

  • [1]

  • [2]

步骤2:因此,现在从那两行中,应该以某种方式运行2个查询(填充了步骤1的数据):

SELECT row_id, row_value FROM users_data WHERE row_id = 1 GROUP BY row_value ORDER BY COUNT(row_value) LIMIT 1;

SELECT row_id, row_value FROM users_data WHERE row_id = 2 GROUP BY row_value ORDER BY COUNT(row_value) LIMIT 1;

第一个查询结果:

[1,2]

第二次查询结果:

[2,1]

步骤3:最后从那2行中,我想更新用户1 row_values。 因此,应执行以下操作:

UPDATE users_data SET row_value = 2 WHERE user_id = 1 AND row_id = 1;

UPDATE users_data SET row_value = 1 WHERE user_id = 1 AND row_id = 2;

所以我希望这些步骤能够自动完成(步骤2的步骤3的数据,步骤1的步骤2的数据),但是我不知道该怎么做(现在我可以用编程语言编写它或填充用记事本查询)。

以下是SQLFiddle中的查询: http ://sqlfiddle.com/#!9/8d5594/14

不知道您在做什么,但这似乎可以做到这一点:

UPDATE users_data u_old
JOIN (
    SELECT DISTINCT u1.user_id, u2.row_id, u2.row_value
    FROM users_data u1
    JOIN users_data u2 USING(row_id)
    WHERE u1.user_id = 1
        AND u2.row_value = (
            SELECT u3.row_value 
            FROM users_data u3
            WHERE u3.row_id = u2.row_id
            GROUP BY u3.row_value
            ORDER BY COUNT(u3.row_value) DESC
            LIMIT 1
        )
) u_new USING (user_id, row_id)
SET u_old.row_value = u_new.row_value

http://sqlfiddle.com/#!9/116ab0/3

您的问题让我有些困惑,您想找到最“受欢迎”的行值,然后将Step 2返回的所有行设置为它们? 但是,大多数“受欢迎”是什么意思? 如果您的意思是找到单个最受欢迎的row_value ,那么您似乎希望能够执行以下操作(希望这不是您的意思,应该可以给您一些想法):

步骤1:获取结果行,其中user_id = 1

SELECT row_id FROM users_data WHERE user_id = 1;

步骤2:找出最受欢迎的row_id

 SELECT a.row_value 
 FROM (
     SELECT COUNT(*), row_value
     FROM users_data 
     WHERE user_id = 1
     GROUP BY row_value
     ORDER BY COUNT(*) DESC
     LIMIT 1
 ) as a

现在更新它们:

 UPDATE `users_data` SET row_values =  
 (
     SELECT a.row_value 
     FROM (
         SELECT COUNT(*), row_value
         FROM users_data 
         WHERE user_id = 1
         GROUP BY row_value
         ORDER BY COUNT(*) DESC
         LIMIT 1
     ) 
 as a) 
 WHERE user_id = 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM