MySql为每个id查找多行

时间:2012-06-23 17:34:26

标签: php mysql sql greatest-n-per-group

我有一个包含3列的表

---QID---TEXT---CID---

我想为每个不同的CID找到20行(QID和TEXT)。我已经准备了字符串$ cid,以便我可以使用WHERE IN语句。

SELECT * FROM questions q1
WHERE cid=(SELECT cid 
    FROM questions q2 
    WHERE q2.cid IN ($cids)
    GROUP BY q2.cid)
ORDER BY q1.qid LIMIT 20

谢谢!

3 个答案:

答案 0 :(得分:1)

简单查询:

$query = 'SELECT QID, TEXT FROM yourDb.yourTable WHERE CID = '.$cid;

或者,如果$cid是一个数组:

$query = 'SELECT QID, TEXT FROM yourDb.yourTable WHERE CID IN('.implode(',',$cid).')';

要获得结果:

$pdo = new PDO('mysql:host=yourDBServer','login','password');
if (!$stmt = $pdo->query($query))
{
    die('query failed');
}
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

有关您可以对PDO对象执行的操作的详细信息,请参阅the manual

快速修复(但不是一个好的)可能是:

$q = 'SELECT QID, TEXT FROM yourDB.yourTB WHERE CID = '.$cid.' LIMIT 20';

CID IN(1,2,3)的情况下,我不确定是否有一种直接的方法可以做到这一点。我能想到的就是使用工会。 Mayby this page可以帮助你解决这个问题。

对于ORDER BY CID ASC也可能是一个非常糟糕的修复,并且使用fetchAll(),请执行此操作:

$query = 'SELECT CID,QID, TEXT FROM yourDb.yourTable WHERE CID IN('.implode(',',$cid).')';

//execute query, same as above: $stmt holds results
$results = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    if (!is_array($results[$row['CID']))
    {
        $results[$row['CID']] = array();
    }
    if (count($results[$row['CID']]) < 20)
    {
        $results[$row['CID']][] = $row;
    }
}

这样,$results数组将找到找到的每个CID的键,并且该键的值将是最多20条记录的数组......

答案 1 :(得分:1)

问题在于使用=运算符并传递 set 值而非一个。将您的查询更改为以下内容,然后重试

SELECT * FROM questions q1 
WHERE cid 
IN $cids 
ORDER BY q1.qid LIMIT 20

答案 2 :(得分:0)

以下代码段使用MySQL变量技巧为每个CID的每一行分配一个数字。为了简化示例,我将每个CID的返回行数限制为2个。

select  cid
,       qid
,       text
from    (
        select  if(@last_cid = cid, @rn := @rn + 1, @rn := 1) as rn
        ,       (@last_cid := cid)
        ,       cid
        ,       qid
        ,       text
        from    YourTable yt
        cross join
                (select @rn := 0, @last_cid := -1) r
        ) as SubQueryAlias
where   rn < 3;

数据设置:

create table YourTable (QID int, TEXT varchar(50), CID int);
insert YourTable values
    (1, 'hi', 1),
    (1, 'hi', 1),
    (2, 'hi', 1),
    (2, 'hi', 1),
    (3, 'hi', 2),
    (4, 'hi', 2),
    (4, 'hi', 2),
    (5, 'hi', 3);

每个CID最多返回两行:

+------+------+------+
| cid  | qid  | text |
+------+------+------+
|    1 |    1 | hi   |
|    1 |    1 | hi   |
|    2 |    3 | hi   |
|    2 |    4 | hi   |
|    3 |    5 | hi   |
+------+------+------+