如何使用另一个表中的随机记录更新给定的mySQL表


How to UPDATE a given mySQL table with random record from another table

我有一个这样的表格tbl_random大约有 3000 个关键字和model_ids。关键字是唯一的,model_ids不是:

+---------+------------+---------+---------+--------------+
| keyword | model_id   | make    |  model  |  more_data   |
+---------+------------+---------+---------+--------------+
| apple1  | 15         |         |         |              |
| apple2  | 15         |         |         |              |
| pear    | 205        |         |         |              |
| cherry  | 307        |         |         |              |
| melon   | 5023       |         |         |              |
+---------+------------+---------+---------+--------------+

我有第二个表tbl_products,其中包含大约 500K 条记录,其中包含实际产品和有关它们的详细信息:

+---------+--------+------------+
| make    | model  | more_data  |
+---------+--------+------------+
| app1    | 15     | data1      |
| app1    | 15     | data2      |
| cher74  | 307    | data4      |
| melo2   | 5023   | data5      |
| pear53  | 205    | data3      |
+---------+--------+------------+

两个表之间的公共标识符分别为model_idmodel

我需要做的是编写一个 UPDATE MySQL 查询,它将根据这些条件更新make modeltbl_random more_data

查询必须从tbl_products中随机选择一个行,该行与唯一关键字的每个model_id tbl_random匹配。

我试图使用 UPDATE、LEFT JOIN 和 SELECT 语句以各种方式做到这一点,但到目前为止无法让它工作。

我的最新声明,尝试仅更新make是这个语句,但是它不起作用 - MySQL 开始执行它,除了我需要重新启动 MySQL 才能使其再次可用之外,什么也没发生:

UPDATE tbl_random
        SET tbl_random.make =
        (SELECT tbl_products.make FROM tbl_products                     
        WHERE tbl_random.model_id = tbl_products.model
        GROUP BY tbl_random.keyword       
        ORDER BY RAND())

tbl_random的最终所需输出是这样的:

+---------+------------+---------+---------+--------------+
| keyword | model_id   | make    |  model  |  more_data   |
+---------+------------+---------+---------+--------------+
| apple1  | 15         | app1    |  15     |  data1       |
| apple2  | 15         | app1    |  15     |  data2       |
| pear    | 205        | pear53  |  205    |  data3       |
| cherry  | 307        | cher74  |  307    |  data4       |
| melon   | 5023       | melo2   |  5023   |  data5       |
+---------+------------+---------+---------+--------------+

任何帮助或建议将不胜感激!

看起来您的内部选择返回多个项目,然后您尝试将其分配给单个字段。

尝试将限制 1 添加到您的内部选择中。

UPDATE tbl_random
    SET tbl_random.make =
    (SELECT tbl_products.make FROM tbl_products                     
    WHERE tbl_random.model_id = tbl_products.model
    GROUP BY tbl_random.keyword       
    ORDER BY RAND() LIMIT 1)

我认为如果冷杉选项不起作用,这可能会起作用

REPLACE tbl_random (keyword, model_id, make, model) INTO
    SELECT rand2.keyword, rand2.model_id, (SELECT tbl_products.make FROM tbl_products                     
        WHERE rand2.model_id = tbl_products.model
        ORDER BY RAND() LIMIT 1), rand2.model_id
    FROM tbl_random as rand2

然后,您必须运行第二个查询以使用 make 和 model 作为唯一键来更新more_data。