2016-04-18 15 views
0

jsonオブジェクト配列の形ですべてのテーブル結果データを提供しているテーブルがあります。この結果は、「メッセージ」テーブルのデータ全体を返します。フィルタMySQLテーブル別のテーブルのリストに基づく結果

目標は、人が$ myusernameと指定reportedByは「blockRequests」テーブルに表示されている場合を除き、すべての結果を参照するには、ユーザー$ myusernameと指定ログインのためです。

マイPHP:

$myusername = $_GET['username']; //the logged in user who is viewing the messages 

$rows = array(); 
$stmt = $conn->query("SELECT * FROM messages ORDER BY datetime DESC"); 
while($r = $stmt->fetch(PDO::FETCH_ASSOC)) 
{ 
    $rows[] = $r; 
} 
print json_encode(array('messageData' => $rows)); 

私は別々のテーブルを持っている'blockedRequests' ユーザは人物が'blockedUsr'としてユーザー名を報告し、ユーザーをブロックするように要求を示しています

すべてのメッセージを返すだけですが、blockedRequestsテーブルに表示される可能性のある'blockedUsr'を除外しています。

enter image description here

マイSQLの知識は、私はテーブルを結合し、望ましい結果を取得する方法を見つけ出すことはできませんので、基本的なものです。私は、これは参加したがフィルタリングされないメッセージのリストを返します

$stmt = $conn->query("SELECT messages.*, blockRequests.* FROM messages 
    LEFT JOIN blockRequests ON messageBox.user = blockRequests.reportedBy") 

を試してみました何

。フィルタリングされたメッセージを取得するためにこれらのテーブルを結合する方法に関するアドバイスは素晴らしいでしょう。 (私は試したものを)

編集

SELECT messages.*, blockRequests.* FROM messages 
LEFT JOIN blockRequests ON messages.user = 'suser' 
WHERE blockRequests.reportedBy IS NULL 

これは私に参加し、テーブルを与えるが、blockedUsrsをフィルタリングしていない、私はまだ結果セットにそれらを参照してください。

FROM left_side_table 
LEFT JOIN right_side_table ON left_side_table.column = right_side_table.column 
WHERE right_side_table.column IS NULL 
    AND left_side_table.some_other_column = 'value' 

これはあなたのLEFT JOINON状態でright_side_tableに1つ以上の行にマッチしたleft_side_tableから行を除外し

+0

どこにしようとしているのですか? –

+0

どこかで$ myusernameをどこに置いてはいけないのですか?blockRequests.blockedUser!= messageBox.userを試してみてください。これは私がここでハングアップしたところです。メッセージテーブルは$ myusernameに基づいて何らかの形でフィルタリングする必要があります – MizAkita

+0

どのようにmessages.userに値を与えますか?メッセージ.MizAkita ie – MizAkita

答えて

1

おそらく、あなたは

SELECT messages.* 
FROM messages 
WHERE messages.userid NOT IN (SELECT blockedusr 
           FROM blockrequests 
           WHERE reportedBy = $myusername); 

を試みることができます。

基本的には次のようになります。このユーザーによって報告されたブロックされたユーザーの一覧にメッセージユーザーIDがないすべてのメッセージを選択します。

この場合、私たちは結合を使用していません...あなたが探しているものから必要ではないと感じました。私はちょうどサブセレクトと "NOT IN"節を使用しました。

+0

これはやった!!!!!!!!私のメッセージテーブルは、blockeUsr(s)を除いて正しくフィルタリングされています...これは大変ありがとうございます! – MizAkita

0

あなたが探しているパターンがあります...。 を編集します。WHERE句には、必要に応じてANDという別の条件を追加できます。

注意:ON節には、通常、両方のテーブルの列が結合されていることが記載されています。そうでない場合、JOIN操作は単に2つのテーブルから可能なすべての行ペアを生成します。両方のテーブルが大きい場合は、非常に大きな結果セットになります。

あなたがそれに慣れるまで少し直感的です。

アプリケーションでは、これが欲しいことがあります。

SELECT messages.* 
    FROM messages 
    LEFT JOIN blockRequests ON messages.user = blockRequests.user 
WHERE blockRequests.reportedBy IS NULL 
    AND messages.usr = 'suser' 

二つのことをここに:第一に、それはこのクエリでSELECT ... blockRequests.*には意味がありません。これらの列は、IS NULL節で保証されています。退屈な。

第2に、messagesblockRequestsテーブルの関係を理解できません。 LEFT JOINが正しく機能するためには、その関係をON句に記述する必要があります。したがって、私の提案するON句は推測です。あなたはORMを経由して、クエリに$ myusernameと指定渡す方法を把握する必要がどこに明らかに

+0

しかし、これは、ログインユーザー$ myusernameに基づいてどのようにフィルタリングするのですか?where句に含めるにはどうすればいいですか? – MizAkita

関連する問題