从联结表中选择一定数量的行

Posted

技术标签:

【中文标题】从联结表中选择一定数量的行【英文标题】:Select certain number of rows from junction table 【发布时间】:2014-08-17 15:37:00 【问题描述】:

我有 3 张桌子:

table1: stores
columns:id(PK), name, visits

table2: categories
columns: id(PK), name

table3: cat_store
columns: store_id(FK), category_id(FK)

共有 27 个类别,每个商店至少有一个类别。 cat_store 是联结表。 我想要实现的是按字母顺序获取所有类别的列表,并在每个类别名称下按名称列出前 10 个访问过的商店。像这样的:

categories.name1
   stores.name1
   stores.name2
   ....
   stores.name10

categories.name2
   stores.name1
   stores.name2
   ....
   stores.name10
...
categories.name27
   stores.name1
   stores.name2
   ....
   stores.name10

目前我有一个包含所有类别名称的数组。然后在一个 foreach 循环中,我得到每个类别的商店。这意味着 28 个查询。

有没有办法用更少的查询来实现这一点?

提前致谢! 附言请原谅我的英语不好。

【问题讨论】:

【参考方案1】:

你的英语很好。

你可以用变量来做到这一点,这可能是最有效的方法:

select cs.*
from (select c.name as catname, s.name as storename, s.visits,
             @rn := if(@cid = c.id, @rn + 1, if(@cid := c.id, 1, 1)) as rn
      from cat_store cs join
           categories c
           on cs.category_id = c.id join
           stores s
           on cs.store_id = s.id cross join
           (select @rn := 0, @cid := 0) vars
      order by c.id, visits desc
     ) cs
where rn <= 10;

注意:这会将类别作为单独的,而不是单独的——这与结果集的表格格式一致。您可以使用rn = 1 逻辑在第一行中轻松找到每个组的类别。

【讨论】:

忘了说我是 mysql-php 的初学者。在 phpmyadmin 中尝试了您的代码并获得 #1248 - Every derived table must have its own alias。我不明白mysql变量。请询问更多详细信息,或介绍教程。 @Mirceac21 。 . .哎呀。定义变量的子查询的表别名在左侧。 效果很好。非常感谢戈登。

以上是关于从联结表中选择一定数量的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据框中选择一定数量的行?

如何使用 NSPredicate 从 CoreData 中删除选定数量的行?

从多个表中选择最大数量

从多个表中选择***产品组合重复产品并求和数量

如何使用 C++ 中的流从文件末尾读取给定数量的行?

过滤掉超过一定数量的 NaN 的行