我有一个包含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
谢谢!
答案 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 |
+------+------+------+