Как ОБНОВИТЬ данную таблицу MySQL со случайной записью из другой таблицы

У меня есть таблица tbl_random с примерно 3000 ключевыми словами и идентификаторами моделей. Ключевое слово уникально, model_id нет:

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

и у меня есть вторая таблица tbl_products с примерно 500 тыс. записей, которая содержит фактические продукты и подробную информацию о них:

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

Общий идентификатор между двумя таблицами — model_id и model соответственно.

Что мне нужно сделать, так это написать запрос UPDATE MySQL, который обновит make model и more_data в tbl_random в соответствии с этими критериями:

Запрос должен выбрать одну случайную строку из tbl_products, которая соответствует каждому model_id из tbl_random для уникальных ключевых слов.

Я пытался сделать это различными способами, используя UPDATE, LEFT JOIN и SELECT STATEMENTS, но пока не могу заставить его работать.

Мое последнее утверждение, пытающееся обновить только 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       |
+---------+------------+---------+---------+--------------+

Любая помощь или предложения будут оценены!


person BradG    schedule 09.01.2015    source источник
comment
если я запускаю оператор select только сверху, я получаю: #1054 - Unknown column 'tbl_random.model_id' in 'where clause'   -  person BradG    schedule 09.01.2015
comment
Кстати, то, что мне удалось сделать успешно, это левое внешнее соединение двух таблиц с помощью этого оператора, я только не могу соответственно обновить таблицу tbl_random: SELECT tbl_random.keyword, tbl_random.model_id, tbl_products.make, tbl_products.model, FROM tbl_random LEFT OUTER JOIN tbl_products ON tbl_random.model_id = tbl_products.model GROUP BY tbl_random ORDER BY RAND()   -  person BradG    schedule 09.01.2015
comment
@Strawberry, утверждение в моем комментарии выше вашего работает так, как должно, и предоставляет данные так, как мне нужно. Однако мне нужно обновить его в постоянной таблице, а не просто получить в запросе выбора. Если у вас есть другие предложения, будем рады обсудить :)   -  person BradG    schedule 09.01.2015
comment
And how do you determine that data1 belongs with apple1 and data2 belongs with apple2 - на самом деле мне не нужно это определять. app1 и app2 могут быть связаны либо с apple1, либо с apple2. Общим для двух таблиц является model_id и model. Так как app1 и app2 имеют model=15, они должны располагаться случайным образом против любого ключевого слова с model_id=15.   -  person BradG    schedule 09.01.2015
comment
В то время как неправильный результат является доказательством неправильного решения, правильный результат не является доказательством правильного решения. К сожалению, это то, где вы находитесь. Что касается случайного распределения значений — это часто симптом плохого дизайна. Это ДОЛЖНО иметь значение!!   -  person Strawberry    schedule 09.01.2015
comment
Давайте продолжим обсуждение в чате.   -  person BradG    schedule 09.01.2015
comment
Я думаю, что сказал все, что мог по этому вопросу!   -  person Strawberry    schedule 09.01.2015
comment
тогда я думаю, вы не можете действительно помочь много.   -  person BradG    schedule 09.01.2015


Ответы (1)


Похоже, ваш внутренний выбор возвращает более одного элемента, а затем вы пытаетесь назначить его одному полю.

Попробуйте добавить LIMIT 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

Затем вам нужно будет выполнить второй запрос для обновления more_data, используя make и model в качестве уникального ключа.

person Leo    schedule 09.01.2015
comment
TOP не является конструкцией MySQL. - person Strawberry; 09.01.2015
comment
ОБНОВЛЕНИЕ tbl_random SET tbl_random.make = (ВЫБЕРИТЕ tbl_products.make ИЗ tbl_products, ГДЕ tbl_random.model_id = tbl_products.model СГРУППИРОВАТЬ ПО tbl_random.keyword ORDER BY RAND() LIMIT 1) - person Nick Bloor; 09.01.2015
comment
@BradG Я чувствую, что неправильно понимаю вопрос. Я добавлю еще пару ответов, пожалуйста, посмотрите, если какой-либо из них продвинет вас вперед. а если нет то что они делают? Я думаю, что второй наиболее близок. - person Leo; 10.01.2015
comment
@BradG, у тебя была возможность попробовать это? - person Leo; 04.02.2015