使用选择数据更新查询

时间:2016-04-14 15:15:11

标签: php mysql

请先看看我的桌子:

[user_id,row_id,row_value] - table: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列表(所以[1,1,1]和[1,2,1])

步骤2:遍历该列表,找出从步骤1获得的列表中的row_id最受欢迎的row_values

步骤3:迭代步骤2的结果,使user_id = 1的row_values与最流行的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:最后从这两行开始,我想更新用户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的数据,步骤2中的步骤2的数据),但我不知道如何制作(现在我可以在编程中编写它)语言或用记事本填写查询。)

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

2 个答案:

答案 0 :(得分:2)

不确定你在做什么,但这似乎就是这样:

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

答案 1 :(得分:0)

我对你的问题感到有点困惑,你想找到最受欢迎的#34;行值,然后将从Step 2返回的所有行设置为它们?但是你最喜欢什么"流行"(s)?如果你的意思是找到最受欢迎的单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;