タイトル: Unknown column 'table_name.id' in 'field list'
SEOタイトル: MySQL「Unknown column ... in field list」の原因と修正(JOIN / 別名のスコープ)
| この記事の要点 |
|
エラー内容
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;
切り分けの手順
- エラー末尾の
in 'xxx clause'でどの句かを特定 SHOW COLUMNS FROM テーブル名で実カラム確認- SQL の
FROM/JOINでつけたエイリアスを洗い出す - エイリアスを使うなら全箇所エイリアスに統一
- サブクエリは内側だけで完結しているか確認
Laravel Eloquent でのケース
<?php
// ❌ 別名 u を付けたのに users.id で参照
$users = DB::table('users as u')
->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 モデルでの場合
<?php
// ❌ withCount のリレーション名と JOIN 結果の参照が食い違い
$users = User::withCount('orders')
->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)。Users と users は別物扱い。カラム名は大小区別なし。
Q: 予約語を使っていると出る?
A: エラーは 1064 syntax error になることが多いですが、バッククォートを忘れて Unknown column になる場合も。SELECT `order` FROM orders のようにバッククォートで囲む。
Q: ビューやマテビューでも同じ?
A: ビューの定義 SQL に問題があると SELECT * FROM view 実行時に 1054 が出ます。SHOW CREATE VIEW view_name で定義を確認。