1

私は MySQL ステートメントがあまり得意ではないので、洞察を探しています。ユーザーが他の人のページにアクセスしたとします。これにより、ユーザー名がパラメーターとしてスクリプトに送信され、現在のユーザーとユーザーがアクセスしているユーザーのページが友達であるかどうかが確認されます。

私の単純なデータベース構造:

フレンズテーブル--relationship_id, friend1_ID, friend2_ID, status

ACTIVE_USERS テーブル-- id, username, email...など。

私の現在のSQLステートメントは次のとおりです。

SELECT * 
FROM friends
JOIN active_users ON ( active_users.username =  '$username' ) 
WHERE (
    friends.friend_1ID = '$current_user_ID'
    AND friends.friend_2ID = active_users.id
    AND friends.status = 1
)

これは機能しますが、エレガントだとは思いません。2 人が友達の場合は行を返しますが、この行は明らかにユーザー情報行と関係行を結合したものです。関係行を取得したいだけです。これを 2 つのステートメントに分割することは経済的でしょうか? たとえば、ユーザー名を使用して訪問したページのユーザー ID を照会し、2 番目のステートメントでその変数を使用して関係を取得します。または、私が出会ったことのない簡単な構文はありますか? 助けていただければ幸いです。

4

2 に答える 2

2

JOINは、複数のテーブルからデータをフェッチするための推奨される方法です。2つの別々の呼び出しを行うよりも高速です。

私自身はMySQLにあまり詳しくありませんが、次のようにすべきではありません。

SELECT b.* 
FROM friends b
JOIN active_users ON ( b.friend_2ID = active_users.id AND active_users.username =  '$username' ) 
WHERE (
    b.friend_1ID = '$current_user_ID'        
    AND b.status = 1
)

(ここでネルソンのコードを変更しました)
おそらくオプティマイザーは同じものを生成しますが、どういうわけか、JOINで関係を定義する方が論理的だと思います。

于 2012-12-10T17:42:38.867 に答える
2

次のように実行できます。

SELECT b.* 
FROM friends b
JOIN active_users ON ( active_users.username =  '$username' ) 
WHERE (
    b.friend_1ID = '$current_user_ID'
    AND b.friend_2ID = active_users.id
    AND b.status = 1
)

friends テーブルの名前のエイリアスを使用することで、結合されたすべてのテーブルをカバーするデフォルトの代わりに、bselect を使用してそのテーブルに属するフィールドを選択することができるため、2 つの結合されたテーブルからすべてのフィールドが返されます。b.**

そのため、クエリ内のテーブルにエイリアス名を付けて、そのエイリアス テーブルに属するフィールドのみを選択できるようにしました。

于 2012-12-10T17:36:43.993 に答える