1

3列のテーブルがあります

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

個別の CID ごとに 20 行 (QID と TEXT) を検索したいと考えています。WHERE INステートメントを使用できるように、文字列 $cid を既に準備しています。

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、 を使用する代わりに、次のようにすることもでき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 ごとに最大 2 行が返されます。

+------+------+------+
| cid  | qid  | text |
+------+------+------+
|    1 |    1 | hi   |
|    1 |    1 | hi   |
|    2 |    3 | hi   |
|    2 |    4 | hi   |
|    3 |    5 | hi   |
+------+------+------+
于 2012-06-23T18:08:19.820 に答える