2016-11-15 33 views
4

このクエリーではInner Joinが必要ですが、100%確実ではないと思います。SQLインナー3つのテーブルとの結合

まず第一に、私のデータベースダイアグラムを参照してください。私が達成しようとしている何

Click here for database diagram

  • 私はすべてのメッセージ(そうuser_usernameを取得しようとしています、text、posted_at FROM Messages)ここで、user_usernameはfollows_usernameと一致し、follows_usernameには=?というfollower_usernameがあります。
  • だから本質的に、誰もが続いて?、私はすべてのメッセージを取得したい。

ここで、 = inputed名

は、私がこれまで

を試してみた私は、SQL文の数を試したし、これまでに成功したことを取得することができませんでした。これらは私が試したものです。

$sql = "SELECT user_username, text, posted_at FROM Messages, Users, User_Follows WHERE user_username = (SELECT username FROM Users WHERE username = (SELECT followed_username FROM User_Follows WHERE follower_username = ?)) ORDER BY posted_at DESC;"; 
$sql = "SELECT user_username, text, posted_at FROM Messages, User_Follows WHERE follower_username = ? AND followed_username = user_username;"; 
$sql = "SELECT user_username, text, posted_at FROM Messages JOIN User_Follows ON user_username = followed_username WHERE follower_username = followed_username;"; 

私は今、私は私が望むものを達成するために参加するが、これは正しい、またはどのようにそれについて移動するかどうか、あまりにもわからないインナーを使用する必要があると思います。

ありがとうございます。

+1

あなたの問題はクロスジョインです。決して暗黙の結合を使用するべきではありません。彼らは非常に貧しい技術で、このような問題を引き起こします。修正を提供するには、テーブル構造を確認する必要があります。 – HLGEM

+3

あなたは私のリンクを見ましたか?@HLGEM – jsmith

答えて

2

ような何か試してみてください:LONG VARCHARまたはnvarchar型のフィールドを使用して将来の設計のための

SELECT M.user_username, M.text, M.posted_at 
FROM Messages M 
INNER JOIN Users U on M.user_username= u.username 
INNER JOIN User_Follows UF on UF.followed_username = u.username 
WHERE UFfollower_username = ? 
ORDER BY posted_at DESC; 

注フィールドのお粗末な選択であるあなた参加する予定です。さらに、フィールドが文字型フィールドの場合、時間の経過と共に変更されることが多く、キーフィールドにとっても悪い選択です。

整数結合は一般的にははるかに高速です。それはあなたがいくつかの結合を行う必要からあなたを保存することができれば大丈夫かもしれないが、一般的にそれは貧しいアイデアです。

誰かが自分のユーザー名を変更した場合(これまでに働いたすべてのシステムで起こります)、すべての子テーブルを更新する必要があります。これは更新するレコードがかなり多い可能性があります。サロゲート・キーを使用した場合は、親表を更新するだけで済みます。

また、テキストという単語は多くのデータベースの予約語です。これらの名前のフィールドに名前を付けないようにすることをお勧めします。

+2

ありがとう、素晴らしい答え – jsmith

-1

シンプルなサブクエリは、それを行う必要があります。

select * from messages where user_username in 
(
    select followed_username from user_follows 
    where follower_username = 'your_input_username' 
); 
+1

私はあなたが選択したSQL反パターンを削除していますか? – HLGEM

+2

@edlerdエラーを出します:あなたはSQL構文に誤りがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、正しい構文が近くにあることを確認してください。(INPUT_USERNAME FROM User_Follows WHERE follower_username = 'kris') – jsmith

関連する問題