2012-06-23 72 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