请先看看我的桌子:
[user_id,row_id,row_value] - table:users_data
内容:
[1, 1, 1]
[2, 1, 2]
[3, 1, 2]
[4, 1, 2]
[1, 2, 1]
[2, 2, 1]
[3, 2, 1]
[4, 2, 1]
[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
答案 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
答案 1 :(得分:0)
我对你的问题感到有点困惑,你想找到最受欢迎的#34;行值,然后将从Step 2
返回的所有行设置为它们?但是你最喜欢什么"流行"(s)?如果你的意思是找到最受欢迎的单row_value
,那么你似乎希望能够做到这样的事情(如果不是你的意思,希望这会给你一些想法):
user_id
= 1 SELECT row_id FROM users_data WHERE user_id = 1;
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;