Php、MySql 连接表,限制每个类别的记录

标签 php mysql

我有两个表:

项目

ID      Name                Model_ID
---------------------------------
1       2010 Audi L1        1
2       2014 BMW X2         2
3       2015 Acura L3       3
4       2016 BMW X5         2
5       2012 BMW X3         2
6       2013 BMW X4         2
7       2015 Acura L1       3
8       2011 Acura L2       3
9       2011 Audi L5        1
10      2012 Audi L6        1

品牌

Model_ID        Title
---------------------
1               Audi
2               BMW
3               Acura

以及以下查询:

  SELECT 
    b.name,
    i.title,
  FROM
    items AS i 
    INNER JOIN brands AS b 
      ON b.Model_ID = i.Model_ID 
  WHERE i.status = 1
  ORDER BY i.created DESC;

上面生成工作数组:

Array
(
    [0] => stdClass Object
        (
            [name] => 2010 Audi L1
            [title] => Audi
        )

    [1] => stdClass Object
        (
            [name] => 2014 MBW X5
            [title] => BMW

        )

        ...
)

比我使用自定义函数循环数组并最终得到

Array
(
    [Acura] => Array
        (
            [0] => stdClass Object
                (
                    [name] => 2015 Acura L1
                    [title] => Acura
                )

            ...
        )

    [BWM] => Array
        (
            [0] => stdClass Object
                (
                    [name] => 2016 BMW X5
                    [title] => BWM
                )

            ...
        )
    [Audi] => Array
        (
            [0] => stdClass Object
                (
                    [name] => 2010 Audi L1
                    [title] => Audi
                )
            ...
        )    
)

现在我可以使用 foreach 循环并限制每个品牌显示 x 个项目,但想法是在数据库中执行此操作,因此我希望能够将每个品牌限制为 5 个项目,而不是提取所有记录品牌。

注意:我没有列出其余的表字段,例如created,它用于对记录进行排序。

最佳答案

  1. 获取品牌:

$q = 'SELECT Model_ID AS id FROM brands ORDER BY title ASC';
$r = mysql_query($q);
$model_ids = array();
while($brand = mysql_fetch_assoc($r)) { $model_ids[] = $brand['id']; }

  • 然后使用从第一步或其他地方(例如:从搜索表单)收集的 Model_ID-s 生成这样的选择查询:

  • $q = array(); 
    foreach($mode_ids AS $model_id) {
        $q[] = '(SELECT b.name, i.title FROM items AS i INNER JOIN brands AS b ON b.Model_ID = i.Model_ID WHERE b.Model_ID = '.(int)$model_id.' AND i.status = 1 ORDER BY i.created DESC LIMIT 5)';
    }
    
    if(!empty($q)) {
        $q = implode(' UNION ALL ', $q);
        $r = mysql_query($q);
        while($record = mysql_fetch_object($r)) {
            var_dump($record);
        }
    }
    

    作为结果,我们将获得结果查询的记录:

    (SELECT b.name, i.title FROM items AS i INNER JOIN brands AS b ON b.Model_ID = i.Model_ID WHERE b.Model_ID=1 AND i.status = 1 ORDER BY i.created DESC LIMIT 5)

    UNION ALL

    (SELECT b.name, i.title FROM items AS i INNER JOIN brands AS b ON b.Model_ID = i.Model_ID WHERE b.Model_ID=2 AND i.status = 1 ORDER BY i.created DESC LIMIT 5)

    UNION ALL

    (SELECT b.name, i.title FROM items AS i INNER JOIN brands AS b ON b.Model_ID = i.Model_ID WHERE b.Model_ID=3 AND i.status = 1 ORDER BY i.created DESC LIMIT 5)

    关于Php、MySql 连接表,限制每个类别的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32215776/

    相关文章:

    mysql - 将一个表中的动态数量的条目存储到另一个表中的单行

    Php如何在同一列中获得UNION结果

    MySQLWhere IN 同时还查找任何具有前面有任意数量的 0 的值的值

    php - 在另一个网站上显示 WordPress 帖子

    javascript - PHP - 单击时从项目列表中的数组调用特定变量/与 JavaScript 混合

    javascript - 如何在javascript中定义嵌套数组?

    php - 如何使用php在单列中一一插入arraylist

    php - mysql 连接两个表

    javascript - Laravel - 在保存到数据库之前删除 JSON header

    PHP 退出并仍然输出缓冲区