Выберите отдельные и случайные строки из одной таблицы, которые соответствуют значению из другой таблицы

Эта тема много обсуждалась, но мне не удалось найти решение, которое я мог бы изменить, и заставить его работать для моего случая. Так что, возможно, более опытный специалист сможет помочь.

У меня есть стол keywords который содержит около 3000 строк с различными ключевыми словами. Против каждого ключевого слова есть соответствие product_id, которые НЕ являются уникальными, то есть некоторые из них повторяются. Таблица выглядит примерно так:

+---------+------------+
| keyword | product_id |
+---------+------------+
| apple1  | 15         |
| apple2  | 15         |
| pear    | 205        |
| cherry  | 307        |
| melon   | 5023       |
+---------+------------+

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

Теперь мне нужно получить одну случайную строку продукта из inventory таблица, которая соответствует каждому product_id от keywords таблицу и вставьте эти строки в другую таблицу.

Результирующая таблица должна быть примерно такой:

+---------+------------+---------+---------+---------+
| keyword | product_id | product |  data1  |  data2  |
+---------+------------+---------+---------+---------+
| apple1  | 15         | app5    |  d1     |  d2     |
| apple2  | 15         | app1    |  d1     |  d2     |
| pear    | 205        | pear53  |  d1     |  d2     |
| cherry  | 307        | cher74  |  d1     |  d2     |
| melon   | 5023       | melo2   |  d1     |  d2     |
+---------+------------+---------+---------+---------+

Это мой запрос на данный момент, и проблема в том, как получить случайный продукт из inventory это соответствует product_id:

SELECT keywords.keyword, keywords.product_id, inventory.*
FROM keywords LEFT OUTER JOIN
inventory
ON keywords.product_id = inventory.id
ORDER BY RAND();

0

Решение

Если вы хотите, чтобы он возвращал строки только тогда, когда между таблицами есть совпадение, то вам нужна обычная (т.е. внутренняя) join не left outer join, Вы также можете добавить слово distinct,

SELECT DISTINCT keywords.keyword, keywords.product_id, inventory.*
FROM keywords JOIN
inventory
ON keywords.product_id = inventory.id
ORDER BY RAND();

И если вы хотите, чтобы только 1 строка вернулась, добавьте limit 1 в конце.

SELECT keywords.keyword, keywords.product_id, inventory.*
FROM keywords JOIN
inventory
ON keywords.product_id = inventory.id
ORDER BY RAND() LIMIT 1;
0

Другие решения

Это то, что вы хотите?

SELECT *
FROM (
SELECT keywords.keyword, keywords.product_id, inventory.*
FROM keywords JOIN
inventory
ON keywords.product_id = inventory.id
ORDER BY RAND()
) tmp
GROUP BY tmp.keyword;

Я также проверяю это в http://sqlfiddle.com/#!2/e559a9/2/0. Просто запустите несколько раз, результат будет случайным.

0

По вопросам рекламы [email protected]