【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. | 列 | 入っているもの | 例 |
|---|---|---|---|
| 1 | ID | 記事の番号。1行ごとにちがう番号が付く | 1、4321 |
| 2 | post_title | 記事のタイトル | Hello world! |
| 3 | post_name | URL の最後の部分(スラッグ) | hello-world |
| 4 | post_type | 行の種類。記事は post、固定ページは page、画像は attachment | post |
| 5 | post_status | 状態。公開中は publish、下書きは draft、予約は future | publish |
wp_posts には、記事だけでなく、固定ページや画像(の登録)も入っています。なので、「記事だけ」を数えたいときは、post_type が post の行にしぼる必要があります。
コマンドの形と、SQL の3つの部品
このシリーズでは、サーバーの画面(ターミナル)で、次の形のコマンドを流します。
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 にたとえると |
|---|---|---|---|
| 1 | SELECT 列 | どの列を見るか | 見たい列だけを表示する |
| 2 | FROM テーブル | どのテーブルを見るか | どのシートを開くか |
| 3 | WHERE 条件 | どの行にしぼるか | フィルターをかける |
上のコマンドは、「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を見せてもらっていました。
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です。
sudo mysql wp_practice -e "SELECT post_type, post_status, COUNT(*) AS n FROM wp_posts ORDER BY post_type='post', post_status='publish';"結果の例:
+------------+-------------+------+
| post_type | post_status | n |
+------------+-------------+------+
| attachment | inherit | 1040 |
+------------+-------------+------+公開中の記事の数が出るつもりでしたが、1040 という大きな数と、attachment(画像)が出ました。何が起きたかを、あとで教えてもらいました。
| No. | 書いたところ | 実際にしたこと |
|---|---|---|
| 1 | COUNT(*) | テーブルの全部の行(1040行)を数えた |
| 2 | GROUP BY がない | 種類ごとに分けずに、全部を1行にまとめた。post_type と post_status の列には、たまたま最初に見つかった行の値が出ただけ |
| 3 | ORDER BY post_type=’post’, post_status=’publish’ | 「並べ替え」なので、行をしぼらない。結果は1行しかないので、並べ替えても何も変わらない |
行をしぼるのは、ORDER BY ではなく WHERE でした。
| No. | 書き方 | 役目 |
|---|---|---|
| 1 | WHERE 条件 | 条件に合う行だけにしぼる |
| 2 | ORDER BY 列 | 行の並べる順番を決める(しぼらない) |
| 3 | GROUP BY 列 | 同じ値の行をまとめる |
場面3:「テーブル」のまま流して、エラーになった
次に、形のヒントをもらいました。
SELECT COUNT(*) FROM テーブル WHERE 条件1 AND 条件2;これを見て書いたのが、次のSQLです。
sudo mysql wp_practice -e "SELECT COUNT(*) FROM テーブル WHERE post_type='post' AND post_status='publish'"結果の例:
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 のあとに書いていました。そこを入れ替えると、数えられました。
sudo mysql wp_practice -e "SELECT COUNT(*) FROM wp_posts WHERE post_type='post' AND post_status='publish'"結果の例:
+----------+
| COUNT(*) |
+----------+
| 173 |
+----------+- SELECT COUNT(*):
行の数を数える - FROM wp_posts:
記事が入っているテーブルから - WHERE post_type=’post’ AND post_status=’publish’:
種類が記事で、しかも状態が公開中の行だけにしぼる
本番の数は、データベースの名前を wordpress に変えるだけで出ました。
sudo mysql wordpress -e "SELECT COUNT(*) FROM wp_posts WHERE post_type='post' AND post_status='publish'"結果の例:
+----------+
| COUNT(*) |
+----------+
| 172 |
+----------+| No. | データベース | 公開中の記事 |
|---|---|---|
| 1 | 本番(wordpress) | 172 |
| 2 | 練習用(wp_practice) | 173 |
1本ちがいます。
場面5:1本ちがう理由を、LIKE で探した
次のお題は、なぜ1本ちがうのかを確かめることでした。ヒントは、練習用のWordPressを作った直後から入っていた記事です。第0回で、パーマリンクを確かめるときに開いた「Hello world!」の記事のことです。
一部の文字で探すには、列 LIKE '%文字%' と書く、と教えてもらいました。% は「何でもよい文字」の印です。最初に書いたのが、次のSQLです。
sudo mysql wp_practice -e "SELECT post_title FROM wp_posts WHERE post_type='post' AND post_status='publish' AND LIKE '%post_title%'"結果の例:
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. | 条件 | 左(どの列か) | まん中 | 右(何を探すか) |
|---|---|---|---|---|
| 1 | post_type=’post’ | post_type | = | ‘post’ |
| 2 | LIKE の条件 | 列の名前 | LIKE | ‘%探す文字%’ |
左の列の名前がなく、右の探す文字のところに列の名前を入れていました。直したつもりで、もう一度書きました。
sudo mysql wp_practice -e "SELECT ID, post_title FROM wp_posts WHERE post_type='post' AND post_status='publish' AND LIKE '%hello-world%'"結果の例:
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! の記事では |
|---|---|---|---|
| 1 | post_title | 記事のタイトル | Hello world! |
| 2 | post_name | URLのスラッグ | hello-world |
スラッグの列で探すと、見つかりました。
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%'"結果の例:
+--------------+
| post_title |
+--------------+
| Hello world! |
+--------------+タイトルの列でも、探してみました。
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%'"結果の例:
+----+--------------+
| 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の部品の意味は、データベースのコマンドの記事でも説明しています。



コメント