从一个表中选择与另一个表中的值匹配的不同行和随机行

时间:2015-01-08 18:53:43

标签: php mysql left-join distinct outer-join

这个主题已经讨论得很多,但我无法找到一个我可以修改的解决方案,并使其适用于我的案例。因此,也许更高级的专家可以提供帮助。

我有一个名为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();

2 个答案:

答案 0 :(得分: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;

答案 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测试它。只运行一次,结果将是随机的。