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

Php 如何使用另一个表中的随机记录更新给定的mySQL表,php,mysql,select,random,sql-update,Php,Mysql,Select,Random,Sql Update,我有一个像这样的tbl_随机表,其中包含大约3000个关键字和模型ID。关键字是唯一的,型号ID不是: +---------+------------+---------+---------+--------------+ | keyword | model_id | make | model | more_data | +---------+------------+---------+---------+--------------+ | apple1 | 15

我有一个像这样的tbl_随机表,其中包含大约3000个关键字和模型ID。关键字是唯一的,型号ID不是:

+---------+------------+---------+---------+--------------+
| 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_id和model

我需要做的是编写一个更新MySQL查询,它将根据以下条件更新make model和tbl_random中的更多_数据:

查询必须从tbl_产品中选择一个随机行,该行与tbl_random中的每个型号id匹配,以获得唯一关键字

我曾尝试使用UPDATE、LEFT JOIN和SELECT语句以各种方式实现这一点,但到目前为止还无法使其正常工作

我的最新声明是,尝试更新only 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作为唯一键更新更多数据。

如果我只运行上面的select语句,我得到:1054-where子句中的未知列“tbl_random.model_id”,顺便说一句,我成功地做到了将两个表与此语句保持外部连接,我似乎只是无法相应地更新tbl_随机表:选择tbl_random.keyword,tbl_random.model_id,tbl_products.make,tbl_products.model,FROM tbl_random LEFT OUTER JOIN tbl_random.model_id=tbl_products.model GROUP BY tbl_randor BY tbl_ORDER BYRAND@Strawberry,我在上面的评论中的陈述是你的工作方式,并以我需要的方式提供数据。但是,我需要在常量表中更新它,而不仅仅是在select查询中获取它。如果您有其他建议,我很乐意讨论:如何确定data1属于apple1,data2属于apple2?实际上我不需要确定。app1和app2可能与apple1或apple2相关。这两个表之间的共同点是model_id和model。由于app1和app2都具有model=15,因此应将它们随机放置在model_id=15的任何关键字上,而不正确的结果是不正确解决方案的证明,正确的结果不是正确解决方案的证明。不幸的是,这就是你的处境。至于值的随机分布——这通常是设计不佳的症状。这应该很重要!!TOP不是MySQL构造。更新tbl\U随机集tbl\U random.make=选择tbl\U产品。从tbl\U产品中生成,其中tbl\U random.model\U id=tbl\U产品。模型组按tbl\U随机。关键字顺序按兰德限制1@BradG我觉得我误解了这个问题。我再加了两个答案,如果其中一个能让你进步,请记住。如果不是,他们做什么?我想第二个是最接近的。@BradG你有机会试试这个吗?