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

标签 php mysql select junction-table

我有 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 个查询。

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

提前致谢! 附言请原谅我糟糕的英语。

最佳答案

你的英语很好。

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

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 逻辑轻松地在第一行中找到每个组的类别。

关于php - 从联结表中选择一定数量的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25350730/

相关文章:

JavaScript - 从不同的函数访问不同的变量

javascript - DOM 与 PHP 输出不匹配

PHP While 循环 - 从表中逐行打印数据

sql - 使用 SQL 进行数据转换

php - 为什么 CakePHP bake 无法连接到在 Windows Vista Ultimate 上运行在 EasyPHP 下的 MySQL?

MySQL INSERT INTO ... SELECT 或默认值

php - 在sqlite3 : looking for SELECT query for an actual composition of members of a certain group中

php - Zend 验证器和多维数组

php - 如果我在 phpmyadmin 上删除一个 mySQL 数据库,它会影响上传到我的 ftp 服务器上的内容吗?

php - 在 SELECT(MYSQL/PHP) 中加入 2 个表