2011-11-09 5 views
0

はこここのmysqlを結合するには、より良い方法がありますか?

$q = $dbc -> prepare("SELECT social.withID, accounts.username 
     FROM social, accounts 
     WHERE social.withID = accounts.id AND social.id = ? AND friendAccept = 1"); 
$q -> execute(array($user['id'])); 

は、基本的にはaccountsテーブルのうち、ユーザ名を引き出し、彼らは友人を受け入れている友人のテーブルに追加し、クエリです。私は結合に新しいですし、私はこのLEFT(私は思う)を使用する必要がありますか湿気を知らないか、または別の?

+0

それは私にとってMySQLの有効なチャンクのように見えません!そこに何か他のものがありますか?有効なMySQLクエリを表示するために削除できますか? –

+0

@ TomalakGeret'kal:軽微な構文エラーを除いて(私はそれを実行していません)、どのように無効に見えますか? – derobert

+0

@derobert:私は '$ q = $ dbc - > prepare'のようなSQL構文を思い出しません。しかし、訂正してうれしい。 –

答えて

2

を有することに反対しているとして、どのような開発者がより明白になりますあなたは現在、内部結合を行っています。あなたのクエリが書き込みに相当します。

SELECT social.withID, accounts.username 
    FROM social INNER JOIN accounts ON (social.withID = accounts.id) 
    WHERE social.id = ? AND friendAccept = 1 

クエリとどのようなあなたが左外側に切り替える取得したい場合は参加の違いは、レコードが右側のテーブルに存在しない場合に何が起こるかです。内部結合の場合、レコードがアカウントに存在しない場合(ON条件に従って、たとえばそのIDを持つアカウントを見つけることができない場合)、行は返されません。左外部結合では、代わりにNULLが返されます。

あなたのスキーマはわかりませんが、接続(withID)は存在するアカウントにしか行かないと思うので、アカウントの行は常に存在します。しかし、のは関連するクエリを考えてみましょう:

SELECT a.account_id, COUNT(s.withID) AS friend_count 
    FROM accounts a INNER JOIN social s ON (a.account_id = s.withID) 
    GROUP BY a.account_id 

あなたは内部結合として(ON条件の一致がないため)、その後、任意の友人のない人々が出力に表示されませんことをままにした場合。左結合に変更すると、友人がいないと出力に表示されます。 [このクエリは、受け入れられたステータスなどを無視している可能性があります。もう一度、私はあなたのスキーマを知らない]

+0

ありがとう、これは私にとってはっきりさせてくれました。はい、接続は常にwithIDと一緒に存在します – cgweb87

0

はい、明示的に示して参加:それはあなたのクエリの意図を隠しません

SELECT social.withID, accounts.username 
     FROM social inner join accounts on social.withID = accounts.id 
     WHERE social.id = ? AND friendAccept = 1 

が、それはあなたの意図は where a.id=b.id

関連する問題