Select 一个 table 中与另一个 table 中的值匹配的不同随机行
Select distinct and random rows from one table that match a value from another table
这个主题已被广泛讨论,但我无法找到可以修改并使其适用于我的案例的解决方案。因此,也许更高级的专家能够提供帮助。
我有一个名为 keywords
的 table,它包含大约 3000 行不同的关键字。每个关键字都有一个匹配的 product_id
,它们不是唯一的,即其中一些是重复的。 Table 看起来像这样:
+---------+------------+
| keyword | product_id |
+---------+------------+
| apple1 | 15 |
| apple2 | 15 |
| pear | 205 |
| cherry | 307 |
| melon | 5023 |
+---------+------------+
我有一个名为 inventory
的第二个 table,其中包含大约 50 万种产品,每种产品都有自己的产品 ID 和其他产品数据。
现在我需要从 inventory
table 中获取一个与 keywords
table 中每个 product_id
相匹配的随机产品行,并将这些行插入到另一个行中table。
结果 table 应该是这样的:
+---------+------------+---------+---------+---------+
| 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();
如果当表之间存在匹配时您希望它只有 return 行,那么您需要常规(即内部)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 行 returned,请在末尾添加 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测试过。只是 运行 几次,结果会随机化。
这个主题已被广泛讨论,但我无法找到可以修改并使其适用于我的案例的解决方案。因此,也许更高级的专家能够提供帮助。
我有一个名为 keywords
的 table,它包含大约 3000 行不同的关键字。每个关键字都有一个匹配的 product_id
,它们不是唯一的,即其中一些是重复的。 Table 看起来像这样:
+---------+------------+
| keyword | product_id |
+---------+------------+
| apple1 | 15 |
| apple2 | 15 |
| pear | 205 |
| cherry | 307 |
| melon | 5023 |
+---------+------------+
我有一个名为 inventory
的第二个 table,其中包含大约 50 万种产品,每种产品都有自己的产品 ID 和其他产品数据。
现在我需要从 inventory
table 中获取一个与 keywords
table 中每个 product_id
相匹配的随机产品行,并将这些行插入到另一个行中table。
结果 table 应该是这样的:
+---------+------------+---------+---------+---------+
| 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();
如果当表之间存在匹配时您希望它只有 return 行,那么您需要常规(即内部)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 行 returned,请在末尾添加 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测试过。只是 运行 几次,结果会随机化。