1

テーブルの内部結合シナリオに行き詰まっています。手伝ってくれませんか?ここで何が間違っていますか?

これが私がやろうとしているシナリオです:

内部結合で入力しようとしている請求国/州の列がありますが、どういうわけか機能していません。ご協力ありがとうございました:

 $sql = $this->connection->query("SELECT * FROM ".TBL_USERS." 
    INNER JOIN ".TBL_USER_LEVEL." ON ".TBL_USERS.".userlevel = ".TBL_USER_LEVEL.".user_level_id 
    INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".country OR ".TBL_USERS.".bcountry = ".TBL_COUNTRIES.".country_id
    INNER JOIN ".TBL_STATES." ON ".TBL_USERS.".states OR ".TBL_USERS.".bstates  = ".TBL_STATES.".states_id
    WHERE ".TBL_USERS.".username = '$username'");

クエリを次のように変更しました。そして、私が得るエラーは

PHP 致命的なエラー:メッセージ「SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1066 Not unique table/alias: 'countries'' を含む例外 'PDOException' がキャッチされない」

 $sql = $this->connection->query("SELECT * FROM ".TBL_USERS." 
    INNER JOIN ".TBL_USER_LEVEL." ON ".TBL_USERS.".userlevel = ".TBL_USER_LEVEL.".user_level_id 
    INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".country = ".TBL_COUNTRIES.".country_id
    INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".bcountry = ".TBL_COUNTRIES.".country_id
    INNER JOIN ".TBL_STATES." ON ".TBL_USERS.".states = ".TBL_STATES.".states_id

    INNER JOIN ".TBL_STATES." ON ".TBL_USERS.".bstates = ".TBL_STATES.".states_id

    WHERE ".TBL_USERS.".username = '$username'");

OKここで正しい構文です@Tiberiu-Ionuț Stanに感謝します

$sql = $this->connection->query("SELECT * FROM ".TBL_USERS." 
    LEFT JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".country = ".TBL_COUNTRIES.".country_id 

   LEFT JOIN ".TBL_COUNTRIES." AS ".TBL_COUNTRIES."_b ON ".TBL_USERS.".bcountry=".TBL_COUNTRIES."_b.country_id

    INNER JOIN ".TBL_USER_LEVEL." ON ".TBL_USERS.".userlevel = ".TBL_USER_LEVEL.".user_level_id 
    LEFT JOIN ".TBL_STATES." ON ".TBL_USERS.".states = ".TBL_STATES.".states_id 

    LEFT JOIN ".TBL_STATES." AS ".TBL_STATES."_b ON ".TBL_USERS.".bstates=".TBL_STATES."_b.states_id


    WHERE ".TBL_USERS.".username = '$username'");
4

2 に答える 2

1

結合ステートメント内でORおよびANDを使用できます。私はいつもそれをします。動作するものは次のとおりです。

  LEFT JOIN `currencies` ON (
   `currency_foreign`=`invoice_entry_amount_currency`
   AND
   `currency_reference`='".$strTransformToCurrency."'
   AND
   `currency_date`=FLOOR(`invoice_paid_timestamp`/86400)*86400
  )

問題はここにあります:

   INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".country = ".TBL_COUNTRIES.".country_id
   INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".bcountry = ".TBL_COUNTRIES.".country_id

MySQLは、countriesテーブルに結合する関係を決定できません(MySQLは.countryと.countrybが異なる可能性があると考えているため、結合後、どの列が返されるか、条件と順序付けに使用されるかがわかりません)。

このようにしてみてください:

  INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".country = ".TBL_COUNTRIES.".country_id
  INNER JOIN ".TBL_COUNTRIES." AS ".TBL_COUNTRIES."_b ON ".TBL_USERS.".bcountry=".TBL_COUNTRIES."_b.country_id

非常に大きなテーブルがある場合は、「TBL_USERS AS TBL_USERS_B」が原因で、MySQLがテーブルコピーを実行しているかどうかを確認するために、条件と順序を含む完全な最終クエリでEXPLAINを実行します。

于 2012-04-26T20:50:10.867 に答える
1

JOIN table ON field OR another_field = expression参照先fieldがブール型でない限り、 のような構造を使用することはできません。

ブール値の結果を返す構造を使用する必要があります。あなたの場合は次のようになります。

$sql = $this->connection->query("SELECT * FROM $TBL_USERS 
    JOIN $TBL_USER_LEVEL ON $TBL_USERS.userlevel = $TBL_USER_LEVEL.user_level_id 
    JOIN $TBL_COUNTRIES ON $TBL_USERS.country = $TBL_COUNTRIES.country_id
      OR $TBL_USERS.bcountry = $TBL_COUNTRIES.country_id
    JOIN $TBL_STATES ON $TBL_USERS.states = $TBL_STATES.states_id
      OR $TBL_USERS.bstates  = $TBL_STATES.states_id
    WHERE $TBL_USERS.username = '$username'");

また、変数を直接使用しました。そうしないと、多くの文字列連結が乱雑に見えます。そして、現在のクエリはSQLi用に開かれています。

于 2012-04-26T20:33:34.027 に答える