Php 限制每个类别的结果数量,必要时提供建议
我有这个密码Php 限制每个类别的结果数量,必要时提供建议,php,mysql,shuffle,Php,Mysql,Shuffle,我有这个密码 <?php function Random($numchar) { $categories = "83 76 168 102"; $array=explode(" ",$categories); shuffle($array); $newstring = implode($array,","); return substr($newstring, 0, $numchar); } $numbers = Random(216); $res = str_r
<?php
function Random($numchar)
{
$categories = "83 76 168 102";
$array=explode(" ",$categories);
shuffle($array);
$newstring = implode($array,",");
return substr($newstring, 0, $numchar);
}
$numbers = Random(216);
$res = str_replace(",","','",$numbers);
$cats = '\''.$res.'\'';
$news = mysql_query("SELECT
item.id AS itemid,
item.cid AS itemcid,
SUBSTRING_INDEX(item.url, '/', 3) AS itemurl,
item.title AS itemtitle,
item.top AS itemtop,
images.id AS imgid,
images.img AS imagesimg,
images.item_id AS imagesitemid,
folders.id AS foldersid,
channels.id AS channelsid,
channels.parent AS channelsparent
FROM item, images, folders, channels
WHERE
item.id = images.item_id
AND item.cid = channels.id
AND channels.parent = folders.id
AND channels.parent = '$cat'
AND FIELD(item.cid, $cats)
ORDER BY
itemtop DESC, RAND(), images.item_id DESC
LIMIT 20");
?>
为了从每个类别中获取5个项目,您必须对每个类别运行单独的子查询(限制为5个),然后将它们组合在一起。以下是一个例子:
SELECT
*
FROM (
(SELECT
item.id AS itemid,
item.cid AS itemcid,
SUBSTRING_INDEX(item.url, '/', 3) AS itemurl,
item.title AS itemtitle,
item.top AS itemtop,
images.id AS imgid,
images.img AS imagesimg,
images.item_id AS imagesitemid,
folders.id AS foldersid,
channels.id AS channelsid,
channels.parent AS channelsparent
FROM
item,
images,
folders,
channels
WHERE
item.id = images.item_id
AND item.cid = channels.id
AND channels.parent = folders.id
AND channels.parent = '$cat[0]'
AND FIELD(item.cid, $cats[0])
LIMIT 5)
UNION ALL
(SELECT
item.id AS itemid,
item.cid AS itemcid,
SUBSTRING_INDEX(item.url, '/', 3) AS itemurl,
item.title AS itemtitle,
item.top AS itemtop,
images.id AS imgid,
images.img AS imagesimg,
images.item_id AS imagesitemid,
folders.id AS foldersid,
channels.id AS channelsid,
channels.parent AS channelsparent
FROM
item,
images,
folders,
channels
WHERE
item.id = images.item_id
AND item.cid = channels.id
AND channels.parent = folders.id
AND channels.parent = '$cat[1]'
AND FIELD(item.cid, $cats[1])
LIMIT 5)
UNION ALL
(SELECT
item.id AS itemid,
item.cid AS itemcid,
SUBSTRING_INDEX(item.url, '/', 3) AS itemurl,
item.title AS itemtitle,
item.top AS itemtop,
images.id AS imgid,
images.img AS imagesimg,
images.item_id AS imagesitemid,
folders.id AS foldersid,
channels.id AS channelsid,
channels.parent AS channelsparent
FROM
item,
images,
folders,
channels
WHERE
item.id = images.item_id
AND item.cid = channels.id
AND channels.parent = folders.id
AND channels.parent = '$cat[2]'
AND FIELD(item.cid, $cats[2])
LIMIT 5)
)sub_query
ORDER BY
itemtop DESC, RAND(), sub_query.item_id DESC
您可能希望在子查询中添加order by,以定义为每个类别返回的5个订单。您可能还需要修改$cat
的定义方式。希望这有帮助。您可以尝试使用用户变量。。。不确定php将如何/是否处理它,但对于原始sql,类似的东西应该可以工作(未经测试,但您应该知道,请参阅以了解更多详细信息):
设置@num:=0,@cid:='';
挑选
item.id作为itemid,
item.cid作为itemcid,
子字符串_索引(item.url,“/”,3)作为itemurl,
item.title作为itemtitle,
item.top作为itemtop,
images.id作为imgid,
images.img作为imagesimg,
images.item_id作为imagesitemid,
folders.id作为foldersid,
channels.id作为channelsid,
channels.parent作为channelsparent,
@num:=如果(@cid=item.cid,@num+1,1)作为行号,
@cid:=作为虚拟的cid
从项目、图像、文件夹、频道
哪里
item.id=images.item\u id
和item.cid=channels.id
和channels.parent=folders.id
和channels.parent='$cat'
和字段(item.cid$cats)
订购人
itemtop DESC组,RAND(),images.item\u id DESC
按item.id、item.cid、item.title分组
拥有行号why notLIMIT 5
?5将显示单个类别中的5个项目,我将不得不为其他类别创建3个其他查询。问题是,当类别变成50个类别时,我不能在同一页上写50个查询。您可以通过在同一个表上使用多个联接查询来完成此操作-每个类别一个。@D_Guy13如果需要,您可以使用foreach($cat as$value)为每个类别写一个循环{
然后使用$query对查询的开始和结束进行预挂起和后挂起操作。=“查询的开始”
然后执行$news=mysql\u query($query);
set @num := 0, @cid := '';
SELECT
item.id AS itemid,
item.cid AS itemcid,
SUBSTRING_INDEX(item.url, '/', 3) AS itemurl,
item.title AS itemtitle,
item.top AS itemtop,
images.id AS imgid,
images.img AS imagesimg,
images.item_id AS imagesitemid,
folders.id AS foldersid,
channels.id AS channelsid,
channels.parent AS channelsparent,
@num := if(@cid = item.cid, @num + 1, 1) as row_number,
@cid := cid as dummy
FROM item, images, folders, channels
WHERE
item.id = images.item_id
AND item.cid = channels.id
AND channels.parent = folders.id
AND channels.parent = '$cat'
AND FIELD(item.cid, $cats)
ORDER BY
itemtop DESC GROUP, RAND(), images.item_id DESC
GROUP BY item.id, item.cid, item.title
having row_number <= 5;