0

作成者は、記事をコミュニティの一部として送信し、PDO クエリを使用して mysql データベースに保存することができます。この例を 7 つの記事で拡張してみましょう。

article_id   author_id   article_title   article_clean   article_kind   good_read
    1            2       War and Peace   war-and-peace     free            y
    2            3       Art of War      art-of-war        free            y
    3            2       Peace and Love  peace-and-love    paid            n
    4            4       Peaceful Living peaceful-living   paid            n
    5            2       Peace Treaties  peace-treaties    free            n
    6            2       Peace is Love   peace-is-love     free            n
    7            4       Peace Countries peace-countries   free            n

私はすでに記事IDからの出力を持っています:

while($row = $articles->fetch(PDO::FETCH_ASSOC)){           
    $article_id_array[] = $row["article_id"];
    $author_id_array[] = $row["author_id"];
    $article_clean_array[] = $row["article_clean"];
    $article_kind_array[] = $row["article_kind"];
}

おそらく CASE を使用して、次のような記事にのみ影響する単一のmysqlコマンドを実行しようとしてい
ます

. 単一の author_id の (無料) 記事のみ、article_title 'Good Read' および article_clean 'good-read' を取得します
3. 単一の author_id の場合、article_title 'Good Read' および article_clean 'good-read' が mysql クエリから、またはその author_id の article テーブルに既に存在するかどうかにかかわらず、既に存在する場合、値 1 が追加されます。
    article_title 'Good Read 1' および article_clean 'good-read- 1'

したがって、上記の例では、クエリの後、articles テーブルは次のようになります。

article_id   author_id   article_title   article_clean   article_kind   good_read
    1            2       Good Read       good-read         free            y
    2            3       Good Read       good-read         free            y
    3            2       Peace and Love  peace-and-love    paid            y
    4            4       Peaceful Living peaceful-living   paid            y
    5            2       Good Read 1     good-read-1       free            y
    6            2       Good Read 2     good-read-2       free            y
    7            4       Good Read       good-read         free            y

このタスクを達成するための単一の PDO クエリが何であるか、何か考えはありますか?

編集:
このテーブルは非常に急速に(数十万件の記事が)成長する可能性があるため、これを行う最も効率的な方法を探しています。参考までに、これはデータベース内のすべての記事ではなく、一度にクエリを実行するスクリプトに 20 ~ 100 個の記事 ID を指定するだけです。

4

1 に答える 1

1

これはROW_NUMBERのような分析関数のないMySQLであるため、OUTERJOINを使用してシミュレートする必要があります。パフォーマンスの観点からは良いオプションではありません。私がタスクを正しく理解している場合は、そのクエリを実行することでこれを達成できます。

 SELECT article_id,
       author_id,
       CASE
         WHEN article_kind = 'free' THEN
           CASE
             WHEN num = 1 THEN 'Good Read'
             ELSE Concat('Good Read ', Cast((num - 1) AS CHAR))
           end
         WHEN article_kind = 'paid' THEN article_title
       end AS article_title,
       CASE
         WHEN article_kind = 'free' THEN
           CASE
             WHEN num = 1 THEN 'good-read'
             ELSE Concat('good-read-', Cast((num - 1) AS CHAR))
           end
         WHEN article_kind = 'paid' THEN article_title
       end AS article_clean,
       article_kind,
       'y' AS good_read
FROM   (SELECT a.article_id,
               a.author_id,
               a.article_title,
               a.article_clean,
               a.article_kind,
               a.good_read,
               Count(*) AS num
        FROM   articles AS a
               LEFT OUTER JOIN articles AS b
                            ON a.author_id = b.author_id
                               AND a.article_id >= b.article_id
                               AND b.article_kind = 'free'
        GROUP  BY article_id,
                  author_id,
                  article_title,
                  article_clean,
                  article_kind,
                  good_read) AS tab;  
于 2012-09-16T10:13:18.317 に答える