2015-01-08 5 views
0

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

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

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

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

Теперь мне нужно получить одну случайную строку продукта из таблицы 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

Привет, разработчик, благодарю вас за ответ. Я на самом деле хочу иметь случайное совпадение для каждого 'keyword', а результат возвращает только уникальное' keyword'. Теперь я получаю повторяющиеся ключевые слова для каждого продукта, который соответствует 'product_id' – BradG

+0

@BradG. Вам, вероятно, придется добавить некоторую группу с' group by'. Группируйте по критериям, по которым вы хотите, чтобы значения были уникальными. (FYI, добавьте предложение 'group by' перед предложением' order by'.) – developerwjk

+0

это работает, просто пробовали с 'left external join' и' group by', и все в порядке. Еще один вопрос: как ограничить ключевые слова, чтобы выбрать, т. Е. Добавить что-то вроде 'WHERE keywords.type = '2''. Может быть, вложенный выбор? – BradG

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

Привет, Чыонг Хуа, благодарю вас за ответ! Я не могу заставить это работать правильно, он перегружает сервер MySQL при попытке его выполнить. – BradG

+0

Действительно? можете ли вы показать мне свои структуры таблиц? Тем не менее, я думаю, что вам нужно ограничить свой результат, потому что я не думаю, что вам нужно получить все из таблицы ключевых слов. Кроме того, порядок RAND() не подходит для производительности, но он также зависит от вашего размера таблицы. –

Смежные вопросы