2012-06-23 34 views
1

我有一个表3列MySql的查找多行每个ID

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

我想找到20行(QID和TEXT),为每个不同的CID。我已经准备了字符串$ 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

还有什么你从 “已经准备串$ CID” 有分开? – Havelock

+0

Whay我所做的是“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 3”,但是这不会上班。 – nickbusted

+0

我收到以下错误:“#1242 - 子查询返回多于一行” – nickbusted

回答

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可以帮助你。

一个的fugly修复也可能是ORDER BY CID ASC,并insted的使用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

查询如何限制为每个不同CID的20行? –

+0

好点,忘了问题的这一部分。我将解决问题 –

+0

不幸的是,我不认为这可以通过使用单个查询来完成。他需要遍历所选的'cID'并为每个提取20行。他将不得不存储所有这些行,直到他遍历所有'cID',因此可能他需要一个带有临时表的存储过程来存储数据。否则,他可以尝试从PHP对每个'cID'进行查询,但会对性能产生负面影响。 –

1

的问题是在使用操作员=并通过一个设置单个一个值,而不是。将您的查询更改为以下内容并重试

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

该查询的工作原理。但是,它总是只返回20行。我需要为每个CID获得20行。所以如果我有3个CID,我预计会得到60行。谢谢。 – nickbusted

+1

我使用LIMIT 20.对不起,我的错误:) – nickbusted

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 | 
+------+------+------+ 
+0

哇:)这看起来很困难。我需要一些时间去理解并尝试一下。我将在稍后添加评论。谢谢! – nickbusted