php - MySql 为每个 id 查找多行

标签 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

谢谢!

最佳答案

简单查询:

$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) 的情况下,我不确定是否有一种简单的方法可以做到这一点。我能想到的就是使用工会。梅比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 条记录的数组。 ..

关于php - MySql 为每个 id 查找多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11171588/

相关文章:

javascript - Woocommerce 2.6.2 添加了禁用属性来更新购物车按钮

mysql - Laravel Homestead - 通过 SSH 隧道连接到远程数据库

php - 仅显示具有不同名称的 <h1> 的第一个

php - 加入mysql表,如果为空则获取所有记录

javascript - PHP 将函数作为函数的参数执行

mysql - SQL无法创建表,errno 150

php - 避免在 MySql 中重复。

php - 如何更改列以支持 unicode

sql - 如何从存储过程返回插入记录的 IDENTITY?

sql - kotlin 与 jooq 并手动编写表模型,无需代码生成