[PR] 本記事にはプロモーションが含まれています。

【MariaDB】初心者のSQL練習帳 第1回:公開中の記事を数えた|WHERE と ORDER BY を取りちがえた

たくさんの記事の中から、条件に合うものだけをしぼって数える様子を表したイラスト WordPress

【2026年10月20日時点の情報です】

このシリーズでは、第0回で作った練習用のWordPressで、AI(Claude)にお題を出してもらい、ヒントだけを見て自分でSQLを書いています。

第1回のお題は、「公開中の記事の数を数える」です。答えだけ見れば1行のSQLですが、たどり着くまでに4回まちがえました。まちがえたSQLとエラーの文も、そのまま載せます。

場面0:お題の前に知っておくこと

お題に入る前に、このシリーズで使う言葉を整理しておきます。私も、ここが分からないまま進めて、何を触っているのか分からなくなりました。

データベースは、Excel のファイルにたとえると分かりやすい

No.データベースの言葉Excel にたとえるとこのシリーズの例
1データベースExcel のファイル1つwp_practice(練習用)、wordpress(本番)
2テーブルファイルの中のシートwp_posts(記事)、wp_comments(コメント)など
3列シートの列(見出し)ID、post_title など
4行シートの1行記事1本、コメント1つ

WordPress のデータベースには、テーブルが10個以上あります。記事の本文やタイトルは wp_posts、コメントは wp_comments、カテゴリーは wp_term_taxonomy というように、中身ごとに別のテーブルに分けて入っています。テーブルの名前の頭の wp_ は、WordPress のテーブルだと分かるように付けている印(接頭辞)です。

記事が入っているテーブル(wp_posts)

第1回で使うのは、記事が入っている wp_posts だけです。記事1本が1行になっています。よく使う列は、次の5つです。

No.列入っているもの例
1ID記事の番号。1行ごとにちがう番号が付く1、4321
2post_title記事のタイトルHello world!
3post_nameURL の最後の部分(スラッグ)hello-world
4post_type行の種類。記事は post、固定ページは page、画像は attachmentpost
5post_status状態。公開中は publish、下書きは draft、予約は futurepublish

wp_posts には、記事だけでなく、固定ページや画像(の登録)も入っています。なので、「記事だけ」を数えたいときは、post_type が post の行にしぼる必要があります。

コマンドの形と、SQL の3つの部品

このシリーズでは、サーバーの画面(ターミナル)で、次の形のコマンドを流します。

Bash
sudo mysql wp_practice -e "SELECT ID, post_title FROM wp_posts WHERE post_type='post'"
  • sudo mysql:
    データベースを操作するプログラム(mysql)を、管理者の権限で動かす
  • wp_practice:
    どのデータベース(Excel のファイル)を開くか
  • -e "…":
    " " の中に書いた SQL(データベースへの命令)を1回だけ流す

SQL は、次の3つの部品を組み合わせて書きます。

No.部品役目Excel にたとえると
1SELECT 列どの列を見るか見たい列だけを表示する
2FROM テーブルどのテーブルを見るかどのシートを開くか
3WHERE 条件どの行にしぼるかフィルターをかける

上のコマンドは、「wp_practice のファイルの、wp_posts のシートで、post_type が post の行だけにしぼって、ID と post_title の列を見る」という意味になります。

場面1:お題とヒント

お題とヒントは、次のとおりでした。

No.項目内容
1お題練習用と本番で、公開中の記事の数がいくつちがうかを確かめる
2ヒント1本番のデータベースは wordpress、練習用は wp_practice
3ヒント2記事は wp_posts のテーブルに入っている
4ヒント3記事は post_type が ‘post’、公開中は post_status が ‘publish’

その前に、練習用の記事を種類と状態ごとに数えるSQLを見せてもらっていました。

Bash
sudo mysql wp_practice -e "SELECT post_type, post_status, COUNT(*) AS n FROM wp_posts GROUP BY post_type, post_status ORDER BY post_type, post_status;"

これは全部の種類と状態の数を出す形です。お題では、「公開中の記事」の数を1つだけ出したいので、これを自分で変えることにしました。

場面2:ORDER BY でしぼろうとして、全部の行を数えた

最初に書いたSQLです。

Bash
sudo mysql wp_practice -e "SELECT post_type, post_status, COUNT(*) AS n FROM wp_posts ORDER BY post_type='post', post_status='publish';"

結果の例:

Plaintext
+------------+-------------+------+
| post_type  | post_status | n    |
+------------+-------------+------+
| attachment | inherit     | 1040 |
+------------+-------------+------+

公開中の記事の数が出るつもりでしたが、1040 という大きな数と、attachment(画像)が出ました。何が起きたかを、あとで教えてもらいました。

No.書いたところ実際にしたこと
1COUNT(*)テーブルの全部の行(1040行)を数えた
2GROUP BY がない種類ごとに分けずに、全部を1行にまとめた。post_type と post_status の列には、たまたま最初に見つかった行の値が出ただけ
3ORDER BY post_type=’post’, post_status=’publish’「並べ替え」なので、行をしぼらない。結果は1行しかないので、並べ替えても何も変わらない

行をしぼるのは、ORDER BY ではなく WHERE でした。

No.書き方役目
1WHERE 条件条件に合う行だけにしぼる
2ORDER BY 列行の並べる順番を決める(しぼらない)
3GROUP BY 列同じ値の行をまとめる

場面3:「テーブル」のまま流して、エラーになった

次に、形のヒントをもらいました。

Plaintext
SELECT COUNT(*) FROM テーブル WHERE 条件1 AND 条件2;

これを見て書いたのが、次のSQLです。

Bash
sudo mysql wp_practice -e "SELECT COUNT(*) FROM テーブル WHERE post_type='post' AND post_status='publish'"

結果の例:

Plaintext
ERROR 1146 (42S02) at line 1: Table 'wp_practice.テーブル' doesn't exist

「テーブル」のところには、本当のテーブルの名前を入れる、という意味でした。エラーの文を読むと、それが分かります。

  • ERROR 1146:
    「テーブルが見つからない」という種類のエラー
  • Table ‘wp_practice.テーブル’:
    データベース wp_practice の中の、「テーブル」という名前のテーブル
  • doesn’t exist:
    ありません

場面4:公開中の記事を数えられた

記事が入っているテーブルの名前(wp_posts)は、最初のSQLの FROM のあとに書いていました。そこを入れ替えると、数えられました。

Bash
sudo mysql wp_practice -e "SELECT COUNT(*) FROM wp_posts WHERE post_type='post' AND post_status='publish'"

結果の例:

Plaintext
+----------+
| COUNT(*) |
+----------+
|      173 |
+----------+
  • SELECT COUNT(*):
    行の数を数える
  • FROM wp_posts:
    記事が入っているテーブルから
  • WHERE post_type=’post’ AND post_status=’publish’:
    種類が記事で、しかも状態が公開中の行だけにしぼる

本番の数は、データベースの名前を wordpress に変えるだけで出ました。

Bash
sudo mysql wordpress -e "SELECT COUNT(*) FROM wp_posts WHERE post_type='post' AND post_status='publish'"

結果の例:

Plaintext
+----------+
| COUNT(*) |
+----------+
|      172 |
+----------+
No.データベース公開中の記事
1本番(wordpress)172
2練習用(wp_practice)173

1本ちがいます。

場面5:1本ちがう理由を、LIKE で探した

次のお題は、なぜ1本ちがうのかを確かめることでした。ヒントは、練習用のWordPressを作った直後から入っていた記事です。第0回で、パーマリンクを確かめるときに開いた「Hello world!」の記事のことです。

一部の文字で探すには、列 LIKE '%文字%' と書く、と教えてもらいました。% は「何でもよい文字」の印です。最初に書いたのが、次のSQLです。

Bash
sudo mysql wp_practice -e "SELECT post_title FROM wp_posts WHERE post_type='post' AND post_status='publish' AND LIKE '%post_title%'"

結果の例:

Plaintext
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'LIKE '%post_title%'' at line 1
  • ERROR 1064 … error in your SQL syntax:
    SQLの書き方(文の形)がおかしい
  • near ‘LIKE …’:
    おかしいのは、LIKE のあたり

LIKE は、すぐ前の条件と同じように、「列」と「探す文字」を並べる形でした。

No.条件左(どの列か)まん中右(何を探すか)
1post_type=’post’post_type=‘post’
2LIKE の条件列の名前LIKE‘%探す文字%’

左の列の名前がなく、右の探す文字のところに列の名前を入れていました。直したつもりで、もう一度書きました。

Bash
sudo mysql wp_practice -e "SELECT ID, post_title FROM wp_posts WHERE post_type='post' AND post_status='publish' AND LIKE '%hello-world%'"

結果の例:

Plaintext
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'LIKE '%hello-world%'' at line 1

右の探す文字は直りましたが、左の列の名前が、まだありませんでした。もう1つ、hello-world は記事のタイトルではなく、URLの最後の部分(スラッグ)でした。WordPressでは、タイトルとスラッグは別の列に入っています。

No.列の名前入っているものHello world! の記事では
1post_title記事のタイトルHello world!
2post_nameURLのスラッグhello-world

スラッグの列で探すと、見つかりました。

Bash
sudo mysql wp_practice -e "SELECT post_title FROM wp_posts WHERE post_type='post' AND post_status='publish' AND post_name LIKE '%hello-world%'"

結果の例:

Plaintext
+--------------+
| post_title   |
+--------------+
| Hello world! |
+--------------+

タイトルの列でも、探してみました。

Bash
sudo mysql wp_practice -e "SELECT ID, post_title FROM wp_posts WHERE post_type='post' AND post_status='publish' AND post_title LIKE '%Hello%'"

結果の例:

Plaintext
+----+--------------+
| ID | post_title   |
+----+--------------+
|  1 | Hello world! |
+----+--------------+

練習用のほうが1本多かったのは、WordPressをインストールしたときに最初から入っていた「Hello world!」でした。ID が 1 なのは、いちばん最初に作られた記事だからです。

まとめ

第1回では、公開中の記事を数えるまでに、次の4つでまちがえました。

No.覚えたことまちがえたところ
1行をしぼるのは WHERE。ORDER BY は並べ替えるだけORDER BY でしぼろうとした
2ヒントの「テーブル」には、本当のテーブルの名前を入れる「テーブル」のまま流した
3条件は「列 = 値」「列 LIKE ‘%文字%’」の形。左に必ず列の名前LIKE の左に列がなかった
4タイトル(post_title)とスラッグ(post_name)は別の列スラッグをタイトルとして探そうとした

どのまちがいも、エラーの文の near ‘…’ のところを読むと、どこがおかしいかの見当がつきました。答えをコピーしたときより、ずっと頭に残っています。

次の第2回は、控えを取ってから、この Hello world! の記事を消すお題です。

SQLの部品の意味は、データベースのコマンドの記事でも説明しています。

ほかの開発・プログラミングの記事は、開発・プログラミングメモの目次から、テーマ別に探せます。

このブログは、にほんブログ村と人気ブログランキングに参加しています。記事が役に立ったら、下のランキングのバナーのどれかを押して応援してもらえると励みになります。

ブログランキング・にほんブログ村へにほんブログ村

サーバー構築・運用ランキング プログラムランキング

WordPress
watasoftdevをフォローする

コメント