MYSQL 为每一行从另一个表连接随机行

Posted

技术标签:

【中文标题】MYSQL 为每一行从另一个表连接随机行【英文标题】:MYSQL join random row from another table for each row 【发布时间】:2020-12-11 06:49:52 【问题描述】:

我有两张表:食物和配料表(请参阅下面的图片 1)。

图片 1

我希望将每种食物的成分随机化(可以是所有食物的重复成分)。如何使用查询来检索价格呢?谢谢

我尝试过使用下面的 SQL,但不是我想要的结果(请参阅 Image 2),因为如果使用 sample SQL 1,所有行的成分保证相同。如果使用sample SQL 2,价格也是随机的,与各自的成分不匹配。

/* sample SQL 1 */
select a.description, b.description, b.price
from Foods a
join (select a1.* from Ingredients a1 order by rand() limit 1) b
;

/* sample SQL 2 */
select a.description, (select a1.description from Ingredients a1 order by rand() limit 1) as description, (select a1.price from Ingredients a1 order by rand() limit 1) as price
from Foods a

图片 2

【问题讨论】:

如何区分description和description? 对不起,我知道你的意思,第一个是食物描述,第二个是成分描述。我希望将食物表中每一行的成分随机化,而不仅仅是所有食物都使用相同的随机成分。谢谢 【参考方案1】:

这也适用于旧版本的 mysql 数据库。

SELECT food, indeg, MAX(rn)
FROM (
       SELECT x.*, @rn := @rn + 1 AS rn
       FROM ( SELECT f.description AS food, i.description AS indeg
              FROM Foods f
              JOIN Ingredients i
              ORDER BY RAND()
             ) x
       JOIN (SELECT @rn := 0) r
    ) a
GROUP BY food

【讨论】:

【参考方案2】:

如果你运行的是 MySQL 8.0,你可以使用 row_number() 来做这个:

select *
from (
    select 
        f.description as food, 
        i.description as ingredient, 
        i.price,
        row_number() over(partition by f.id order by random()) rn
    foods f
    cross join ingredient i
) t
where rn = 1

【讨论】:

以上是关于MYSQL 为每一行从另一个表连接随机行的主要内容,如果未能解决你的问题,请参考以下文章

使用连接时为每个不同的字段值选择随机行

mysql-从每个id中选择一个随机行

html5画布精灵表随机行/列

从 sqlite 表中选择随机行

从 SQL Server 表中选择 n 个随机行

在 MySQL 中选择随机行