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

MYSQL为每一行从另一个表中随机连接一行,mysql,join,random,greatest-n-per-group,window-functions,Mysql,Join,Random,Greatest N Per Group,Window Functions,我有两张桌子:食物和配料(参考下面的图片1) 图像1 我希望将配料随机化到每种食物中(可以是所有食物的重复配料)。如何使用查询来检索价格呢?谢谢 我尝试过使用下面的SQL,但没有得到我想要的结果(请参阅图像2),因为如果使用示例SQL 1,所有行的成分都保证相同。如果使用示例SQL 2,价格也会随机化,与相应的成分不匹配 /* sample SQL 1 */ select a.description, b.description, b.price from Foods a join (sele

我有两张桌子:食物和配料(参考下面的图片1)

图像1

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

我尝试过使用下面的SQL,但没有得到我想要的结果(请参阅图像2),因为如果使用
示例SQL 1
,所有行的成分都保证相同。如果使用
示例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

如果您运行的是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数据库的旧版本

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

你怎么知道描述和描述之间的区别?对不起,我知道你的意思,第一个是食物描述,第二个是成分描述。我希望随机分配食物表中每一行的成分,而不仅仅是所有食物的相同随机成分。谢谢