1

我有一个有 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

谢谢!

4

3 回答 3

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 对象的更多信息,请参阅手册

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

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

在 的情况下CID IN(1,2,3),我不确定是否有一种直截了当的方式来做到这一点。我能想到的就是使用工会。也许这个页面可以帮助你。

一个丑陋的修复也可能是ORDER BY CID ASC,并使用 using 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 条记录的数组...

于 2012-06-23T17:45:22.780 回答
1

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

SELECT * FROM questions q1 
WHERE cid 
IN $cids 
ORDER BY q1.qid LIMIT 20
于 2012-06-23T17:48:43.870 回答
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   |
+------+------+------+
于 2012-06-23T18:08:19.820 回答