7.

MySQL「Unknown column ... in field list」の原因と修正(JOIN / 別名のスコープ)

編集
この記事の要点
  • 意味: SELECT / WHERE / ON 句で存在しないカラム or テーブル修飾を参照
  • 主原因: ① テーブル名/カラム名タイポ、② AS 別名を付けた後に元テーブル名で参照、③ サブクエリの外側カラムを内側で参照、④ JOIN 順とエイリアスの取り違え
  • 切り分け: SHOW COLUMNS FROM table で実カラム名確認、DESC table、エラーメッセージのテーブル名がエイリアスか実名か区別
  • JOIN ON 句でエイリアスを使ったら、SELECT/WHERE もエイリアスで統一
  • ORM(Laravel Eloquent / Doctrine)は SQL を吐かせて確認(toSql() / dd)

エラー内容

ERROR 1054 (42S22): Unknown column 'users.id' in 'field list'

# 'field list'    = SELECT 句で起きた
# 'where clause'  = WHERE 句で起きた
# 'on clause'     = JOIN ON 句で起きた
# 'order clause'  = ORDER BY で起きた

MySQL が「指定されたカラムやテーブル.カラム表記が見当たらない」と言っているエラーです。SQL のどの句で起きたかが括弧内に明記されるので、まずそこを読みます。

原因 1: カラム名 / テーブル名のタイポ

-- ❌ 実際のカラムは user_id だが userid と書いた
SELECT userid FROM orders;
-- ERROR 1054: Unknown column 'userid' in 'field list'

-- 確認
SHOW COLUMNS FROM orders;
DESC orders;

-- ✅ 修正
SELECT user_id FROM orders;

原因 2: AS でエイリアスを付けた後に元テーブル名で参照

もっとも多い罠。FROM や JOIN でエイリアスを付けると、その SQL 内では元テーブル名は使えません:

-- ❌ エイリアス u を付けたのに users.id を参照
SELECT users.id, users.name
FROM users AS u
JOIN orders AS o ON o.user_id = users.id;
-- ERROR 1054: Unknown column 'users.id' in 'field list'

-- ✅ エイリアスで統一
SELECT u.id, u.name
FROM users AS u
JOIN orders AS o ON o.user_id = u.id;

原因 3: サブクエリのスコープミス

サブクエリの内側からは外側のカラムが見えない場合がある(相関サブクエリ以外):

-- ❌ サブクエリ内に products.category_id は無い
SELECT p.name
FROM products p
WHERE p.id IN (
    SELECT id FROM products_top
    WHERE products.category_id = 5  -- ★ 外側の products を参照
);
-- ERROR 1054: Unknown column 'products.category_id' in 'where clause'

-- ✅ 内側にも参照を入れるか、JOIN に書き換える
SELECT p.name
FROM products p
JOIN products_top pt ON pt.id = p.id
WHERE p.category_id = 5;

原因 4: JOIN の ON 句でテーブル名が違う

-- ❌ JOIN したテーブル名と ON 句が食い違う
SELECT *
FROM users u
JOIN orders o ON o.user_id = customers.id;
-- ERROR 1054: Unknown column 'customers.id' in 'on clause'

-- ✅ 修正
SELECT *
FROM users u
JOIN orders o ON o.user_id = u.id;

原因 5: GROUP BY / ORDER BY での参照ミス

-- ❌ SELECT で別名を付けたカラムを別名で ORDER BY しているが、
--    その別名と異なる名前を使った
SELECT
  u.name,
  COUNT(*) AS cnt
FROM users u
JOIN orders o ON o.user_id = u.id
GROUP BY u.id
ORDER BY count;  -- ★ 別名は cnt
-- ERROR 1054: Unknown column 'count' in 'order clause'

-- ✅
ORDER BY cnt;

切り分けの手順

  1. エラー末尾の in 'xxx clause' でどの句かを特定
  2. SHOW COLUMNS FROM テーブル名 で実カラム確認
  3. SQL の FROM / JOIN でつけたエイリアスを洗い出す
  4. エイリアスを使うなら全箇所エイリアスに統一
  5. サブクエリは内側だけで完結しているか確認

Laravel Eloquent でのケース

join('orders as o', 'o.user_id', '=', 'u.id')
    ->select('users.id', 'users.name')   // ← ここ
    ->get();
// SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.id'

// ✅ エイリアスで統一
$users = DB::table('users as u')
    ->join('orders as o', 'o.user_id', '=', 'u.id')
    ->select('u.id', 'u.name')
    ->get();

// デバッグ: 実際に発行される SQL を確認
$sql = DB::table('users as u')
    ->join('orders as o', 'o.user_id', '=', 'u.id')
    ->select('u.id')
    ->toSql();
dd($sql);

Eloquent モデルでの場合

orderBy('order_count')  // ★ 実際は orders_count
    ->get();
// Unknown column 'order_count'

// ✅
$users = User::withCount('orders')
    ->orderBy('orders_count')
    ->get();

マイグレーション直後に出る場合

「ローカルでは動いていたのに本番だけ出る」場合、マイグレーションが本番で未実行の可能性:

# Laravel
php artisan migrate:status
php artisan migrate --force

# 該当テーブルのカラム状態を直接確認
mysql -u root -p myapp -e "SHOW COLUMNS FROM users"

FAQ

Q: 大文字小文字が違うだけでも出る?
A: Linux の MySQL はテーブル名で大小区別あり(既定 lower_case_table_names=0)。Usersusers は別物扱い。カラム名は大小区別なし。

Q: 予約語を使っていると出る?
A: エラーは 1064 syntax error になることが多いですが、バッククォートを忘れて Unknown column になる場合も。SELECT `order` FROM orders のようにバッククォートで囲む。

Q: ビューやマテビューでも同じ?
A: ビューの定義 SQL に問題があると SELECT * FROM view 実行時に 1054 が出ます。SHOW CREATE VIEW view_name で定義を確認。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Invalid HTTP_HOST header: '...'. You may need to add '...' to ALLOWED_HOSTS
  2. CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.
  3. django.utils.datastructures.MultiValueDictKeyError
  4. Forbidden (403) CSRF verification failed. Request aborted.
  5. ModuleNotFoundError: No module named 'MySQLdb'
  6. WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection
  7. Unknown column 'table_name.id' in 'field list'
  8. RuntimeError: Model class ~ doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
  9. get() returned more than one MynumberRegist -- it returned 2!
  10. django.db.utils.OperationalError: (2006, "Can't connect to MySQL server")
  11. 'include' is not defined