3

3 つのテーブルを結合しようとしていますが、フィールド リストに「不明なテーブル 'calls'」が表示され続けます。テーブル「calls」が存在することを知っています

これは機能します...

$sql = "SELECT * FROM calls WHERE id = '$diary_id'";

しかし、これはそうではありません...

$sql = "SELECT * FROM (SELECT calls.id AS calls_id, calls.assigned_user_id AS assigned_user) calls
RIGHT JOIN accounts on accounts.parent_id = accounts.id
LEFT JOIN users on assigned_user = user.id
WHERE calls_id = '$diary_id'";

結合しようとしているテーブルのフィールド名が同じであるため、エイリアスを使用しようとしています (継承されたデータベースを使用する必要があります)。

どんな助けでも大歓迎です

4

1 に答える 1

7

サブクエリ:

SELECT calls.id AS calls_id, calls.assigned_user_id AS assigned_user

選択calls.idしていますが、テーブル/エイリアスが定義されている句calls.assigned_userはありません。サブクエリに追加します (ただし、なぜここでサブクエリを使用するのでしょうか?)。FROMcallsFROM calls

user.id結合基準でも参照していますが、テーブルは と呼ばれていusersます。

また、アカウント テーブルの結合基準accounts.parent_id = accounts.idは非常に疑わしいようです。隣接リスト モデルを使用して格納された階層データをトラバースしようとしているようですが、この結合ではそれが実現しません。実際、MySQL は再帰関数をサポートしていないため、このモデルにはまったく適していません。ネストされたセットまたはクロージャ テーブルのいずれかを使用するようにデータを再構築することを検討してください。詳細については、この回答を参照してください。

その代わり:

SELECT *
FROM   calls
  RIGHT JOIN accounts ON accounts.parent_id  = accounts.id -- is this right?
   LEFT JOIN users    ON calls.assigned_user = user.id
WHERE calls.id = '$diary_id'
于 2012-08-31T17:31:25.983 に答える