web-dev-qa-db-ja.com

このSQLコードがエラー1066(一意でないテーブル/エイリアス: 'user')を返すのはなぜですか?

これは私のテーブル構造です:

alt text

エラーメッセージは次のとおりです。

#1066-一意ではないテーブル/エイリアス: 'user'

以下は私のコードです。

SELECT article.* , section.title, category.title, user.name, user.name
FROM article
INNER JOIN section ON article.section_id = section.id
INNER JOIN category ON article.category_id = category.id
INNER JOIN user ON article.author_id = user.id
LEFT JOIN user ON article.modified_by = user.id
WHERE article.id = '1'
16
neobeacon

2回目に参加するときは、ユーザーテーブルにエイリアスを与える必要があります。

例えば.

SELECT article . * , section.title, category.title, user.name, u2.name 
FROM article 
INNER JOIN section ON article.section_id = section.id 
INNER JOIN category ON article.category_id = category.id 
INNER JOIN user ON article.author_id = user.id 
LEFT JOIN user u2 ON article.modified_by = u2.id 
WHERE article.id = '1'
34
codeulike

あなたのエラーはあなたが持っているためです:

     JOIN user ON article.author_id = user.id
LEFT JOIN user ON article.modified_by = user.id

同じテーブルの2つのインスタンスがありますが、データベースはどちらがどれであるかを判別できません。これを修正するには、table aliasesを使用する必要があります。

     JOIN USER u ON article.author_id = u.id
LEFT JOIN USER u2 ON article.modified_by = u2.id

このような状況が発生していないときに常に完全なテーブル名を書き込むのが好きでない限り、常にテーブルにエイリアスを設定することをお勧めします。

次に取り組む問題は次のとおりです。

SELECT article.* , section.title, category.title, user.name, user.name

1)SELECT *は絶対に使用しないでください。テーブル全体であっても、必要な列を必ず入力してください。 これを読むSO理由を理解するための質問

2)user.name列に関連するあいまいな列エラーが発生します。これも、データベースがどのテーブルインスタンスからデータをプルするかを判断できないためです。テーブルエイリアスを使用すると、問題が修正されます。

SELECT article.* , section.title, category.title, u.name, u2.name
7
OMG Ponies

FROM句で「ユーザー」を2回指定しました。ユーザーの言及ごとに、少なくとも1つの言及にテーブルエイリアスを提供する必要があります。いずれかのインスタンスに固定できます。

FROM article INNER JOIN section
ON article.section_id = section.id
INNER JOIN category ON article.category_id = category.id
INNER JOIN user **AS user1** ON article.author\_id = **user1**.id
LEFT JOIN user **AS user2** ON article.modified\_by = **user2**.id
WHERE article.id = '1'

(別のものが必要になる場合があります-私はどちらのユーザーがどちらであるかを推測しましたが、SQLエンジンは推測しません。)

また、多分あなたはたった1人の「ユーザー」しか必要としませんでした。知るか?

6
Steve Kass
    SELECT art.* , sec.section.title, cat.title, use1.name, use2.name as modifiedby
FROM article art
INNER JOIN section sec ON art.section_id = sec.section.id
INNER JOIN category cat ON art.category_id = cat.id
INNER JOIN user use1 ON art.author_id = use1.id
LEFT JOIN user use2 ON art.modified_by = use2.id
WHERE art.id = '1';

これが役に立てば幸い

0
Anindyo Bose