[英]Select distinct and random rows from one table that match a value from another table
这个主题已经讨论了很多,但是我找不到能够修改并使之适用于我的情况的解决方案。 因此,也许更高级的专家将能够提供帮助。
我有一个称为keywords
的表,其中包含约3000行,各有不同的关键字。 每个关键字都有一个匹配的product_id
,它们不是唯一的,即重复其中的一些。 表看起来像这样:
+---------+------------+
| keyword | product_id |
+---------+------------+
| apple1 | 15 |
| apple2 | 15 |
| pear | 205 |
| cherry | 307 |
| melon | 5023 |
+---------+------------+
我还有第二个表,称为inventory
,其中包含大约500K的产品,每个产品都有其自己的产品ID和其他产品数据。
现在,我需要从inventory
表中获得一个随机产品行,该product_id
与keywords
表中的每个product_id
相匹配,然后将这些行插入到另一个表中。
结果表应该是这样的:
+---------+------------+---------+---------+---------+
| 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 |
+---------+------------+---------+---------+---------+
这是我目前的查询,问题是如何从与product_id
匹配的inventory
中获取随机产品:
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对其进行了测试。 只需运行几次,结果将是随机的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.