php mysql 2选择1选择

时间:2014-07-13 10:21:53

标签: php mysql

id | cid | name 
 1 | 1   | product 1 
 2 | 1   | product 2 
 3 | 1   | product 3 
 4 | 1   | product 4 
 5 | 1   | product 5 
 6 | 1   | product 6 
 7 | 2   | product 7 
 8 | 2   | product 8
 9 | 2   | product 9 
10 | 2   | product 10 
11 | 2   | product 11 
12 | 2   | product 12 
13 | 3   | product 13 
14 | 3   | product 14
15 | 3   | product 15
16 | 3   | product 16 

PHP:

$query  = "SELECT cid FROM product GROUP BY cid  ORDER by cid DESC";
$result = mysql_query($query) or die('Error : ' . mysql_error()); 

echo 'id |cid | name  <br>';

while($row = mysql_fetch_array($result, MYSQL_NUM))
{
    list($cid) = $row;

    $query2  = "SELECT id, cid, name FROM product WHERE cid  = $cid ORDER by id DESC LIMIT 3";
    $result2 = mysql_query($query2) or die('Error : ' . mysql_error());

    while($row2 = mysql_fetch_array($result2, MYSQL_NUM)){
        list($id2, $cid2, $name2) = $row2;
        echo ''.$id2.' | '.$cid2.' | '.$name2.'  <br>';
    }   

}

返回==&gt;&gt;

id | cid | name 
16 | 3   | product 16 
15 | 3   | product 15 
14 | 3   | product 14 
12 | 2   | product 12 
11 | 2   | product 11 
10 | 2   | product 10 
 6 | 1   | product 6 
 5 | 1   | product 5 
 4 | 1   | product 4 

现在,我不想选择1选择。

示例:

    $query  = "SELECT cid FROM product WHERE (SELECT id, cid, name FROM product WHERE cid  = $cid ORDER by id DESC LIMIT 3) GROUP BY cid  ORDER by cid DESC";
    $result = mysql_query($query) or die('Error : ' . mysql_error());

    while($row = mysql_fetch_array($result, MYSQL_NUM)){
        list($id, $cid, $name) = $row;
        echo ''.$id.' | '.$cid.' | '.$name.'  <br>';
    }

返回==&gt;&gt;

id | cid | name 

16 | 3   | product 16 
15 | 3   | product 15 
14 | 3   | product 14
12 | 2   | product 12 
11 | 2   | product 11 
10 | 2   | product 10 
 6 | 1   | product 6 
 5 | 1   | product 5 
 4 | 1   | product 4 

帮助我!感谢您的支持

2 个答案:

答案 0 :(得分:0)

如果不使用程序,我不知道这是否是最优雅的解决方案...

这里做的是SUBSTRING_INDEX用于限制GROUP_CONCAT使用的条目。

GROUP_CONCAT的结果用作FIND_IN_SET搜索的集合。

SELECT
    p1.*
FROM
    products p1
    inner join (
        SELECT
            SUBSTRING_INDEX(GROUP_CONCAT(p2.id SEPARATOR ','), ',', 3) AS ids
        FROM
            products p2
        GROUP BY
            p2.cid
    ) AS ids
        ON FIND_IN_SET(p1.id, ids.ids)
ORDER BY
    p1.cid DESC,
    p1.id

DEMO

PS:

您现在不会遇到这种情况,但请注意:GROUP_CONCAT具有最大长度设置(如字符串的字符长度),用于设置GROUP_CONCAT可以返回的内容。默认情况下,这是1024个字符,因此对于3个INT ID就足够了,因为每个带有adjending逗号的INT id最多为12个字符。如果你走极端并想要超过85条记录每个cid ,你需要调整你的mysql group_concat_max_len设置。

答案 1 :(得分:0)

实现它的最简单方法是

SELECT *
FROM   product p
WHERE (
  SELECT  COUNT(*) 
  FROM    product  p1
  WHERE p1.cid = p.cid AND 
  p.id <= p1.id
) <= 3
order by p.id desc

<强> DEMO