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 not
LIMIT 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;