Эта тема много обсуждалась, но мне не удалось найти решение, которое я мог бы изменить, и заставить его работать для моего случая. Так что, возможно, более опытный специалист сможет помочь.
У меня есть стол 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();
Если вы хотите, чтобы он возвращал строки только тогда, когда между таблицами есть совпадение, то вам нужна обычная (т.е. внутренняя) 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;
Это то, что вы хотите?
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. Просто запустите несколько раз, результат будет случайным.