【问题标题】:MYSQL join random row from another table for each rowMYSQL 为每一行从另一个表连接随机行
【发布时间】: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?
  • 对不起,我知道你的意思,第一个是食物描述,第二个是成分描述。我希望将食物表中每一行的成分随机化,而不仅仅是所有食物都使用相同的随机成分。谢谢

标签: mysql join random greatest-n-per-group window-functions


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 2012-11-23
      • 1970-01-01
      • 2011-03-04
      • 2020-09-23
      • 2015-06-27
      相关资源
      最近更新 更多