当前位置: 首页 > 知识库问答 >
问题:

Laravel-在应用“order by”后,在特定列中随机选择n个包含相同值的行

濮阳景天
2023-03-14

在我的Laravel项目中,在数据库表ads中,我有以下结构:

id | col1 | col2

col2的值包括topadbumpemergency以及空值。我想从ads表中获取所有行,并根据col2按字母顺序降序排序。

所以我用了:

Ads::orderBy('col2','DESC')->get()

现在我有两个条件要应用于查询。

第一种情况:假设在col2中有4行带有topad,在col2中有5行带有emergency,在col2中有6行带有bump,在col2中有7行带有空值。因此,在col2中带有emergency的行将显示在第一位,在col2中带有topad的行将显示在第二位,在col2中带有bump的行将显示在第三位,在col2中带有空值的行将显示在第四位。现在我需要在每个集合中随机化行的顺序。例如,在col2中带有topad的行可能具有id1,2,3,4。我想随机化这些行(这可能导致例如4,2,1,3)。但它们将出现在col2中包含topad的行之前。对于topadbump行集以及col2中包含任何空值的行,情况也是如此。

所以查询变成了:

Ads::orderBy('col2','DESC')->inRandomOrder()->get(); 

第二个条件:假设行按col2值排序。但是从col2中包含相同值的每组行中,我需要ncol2中具有非空值的行的行数,也就是说,随机地,我需要n来自emergencyed行的行,n来自topaded行,nfrombumped行和所有来自emptyed行。

那么如何编写查询呢?

共有1个答案

百里弘致
2023-03-14

您可以使用子查询来实现这一点,但根据我的经验,执行子查询要比执行几个较小的查询花费更多的时间(如果索引正确的话)。此外,您还可以更好地控制限制和调试问题。

$top_ads = Ads::whereCol2('topad')->inRandomOrder()->limit(5)->get();
$urgent_ads = Ads::whereCol2('urgent')->inRandomOrder()->limit(10)->get();
$bump_ads = Ads::whereCol2('bump')->inRandomOrder()->limit(2)->get();

这将创建您的查询,然后您可以对它们的集合执行任何您想要的操作。合并、重新排序等。

 类似资料:
  • 问题内容: 我正在努力寻找以下问题的最佳解决方案。假设我有一个像这样的表“ Table”: 我想为集合中的每个值选择:(’name1’,’name2’)10个随机唯一行。当然,可以像这样进行联合: 但是,如果我有100个唯一的名称,而我必须为其选择10个随机记录,则此查询将有点大。 提前非常感谢 问题答案: SQLFiddle演示

  • 我想显示“users”表中两个指定列“first_name”和“pic”的所有值。我正在尝试“Pulk”,但它在echo时显示为json格式。但我需要展示给大家看,一些东西——‘John pic’。求求你,有人帮帮我。这是我在“索引”中的示例代码。刀身php的吼声-

  • 假设我在表中有7列,我想只选择其中的两列,类似这样 在laravel雄辩的模型中,它可能是这样的 但我猜这个表达式将选择id等于1的所有列,我只需要两列(名称、姓氏)。如何只选择两列?

  • 问题内容: 我有一个包含约50,000行的SQL Server表。我想随机选择大约5,000行。我想到了一种复杂的方法,用“随机数”列创建一个临时表,将我的表复制到该表中,遍历该临时表并用来更新每一行,然后从该表中选择随机数列< 0.1。我正在寻找一种更简单的方法,如果可能的话,可以在一个语句中进行说明。 本文建议使用该功能。这看起来很有希望,但是我看不到如何可靠地选择一定百分比的行。 有人做过吗

  • 问题内容: 我使用以下内容创建了一个数据框: 我想获得含有从每列的数据帧具有在他们的名字。这只是我的问题的一个简单版本,因此我的实际数据框将具有更多列。 问题答案: 替代方法:

  • 问题内容: 我想选择不具有VAL =’current’的任何行的唯一ID(与多行关联)。 例如,在这样的表中: 我希望它返回ID 23,因为它没有VAL =’current’的行。请注意,在此表中,主键(PK)是唯一的,但ID不是唯一的(因此需要使用DISTINCT或GROUP BY)。 这是我在PHP中拥有的东西: 这就是它的总要旨。如您所见,完成此任务需要两个SQL语句。有没有更短的方法可以做