我有两个表:
项目
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,它用于对记录进行排序。
最佳答案
- 获取品牌:
$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/