我有一个表,它以json对象数组的形式向我提供了所有表结果数据。这个结果返回整个"消息"表数据。
目标是让登录用户 $ myusername 查看所有结果,除非有人出现在' blockRequests'表格 $ myusername 是 reportedBy 。
我的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));
我有一个单独的表&#39; blockedRequests&#39; ,列出了阻止用户的请求,用户将用户名称报告为&#39; blockedUsr&#39; < /强>
我只是尝试返回所有邮件,但不包括任何可能出现在blockedRequests表中的&n'clocks.r&#39; 。
我的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
这为我提供了连接表,但没有过滤被阻止的用户,我仍然在结果集中看到它们。
答案 0 :(得分:1)
也许你可以试试
SELECT messages.*
FROM messages
WHERE messages.userid NOT IN (SELECT blockedusr
FROM blockrequests
WHERE reportedBy = $myusername);
显然你需要弄清楚如何通过你的orm将$ myusername传递给查询。
基本上它的内容如下:选择消息用户ID不在此用户报告的被阻止用户列表中的所有消息。
在这种情况下,我们没有使用加入......我觉得从你要找的东西中没有必要。我只是使用了一个子选择和&#34; NOT IN&#34;条款。
答案 1 :(得分:0)
您正在寻找的模式是......
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_side_table
中与right_side_table
ON
条件LEFT JOIN
中的一行或多行相匹配的行。 修改:您可以根据需要使用WHERE
为AND
子句添加其他条件。
请注意:您的ON
子句通常会提到要加入的两个表中的列。如果没有,JOIN操作只会从两个表中生成所有可能的行对。如果两个表都很大,则会产生非常大的结果集。
在你习惯它之前,这有点违反直觉。
在您的应用程序中,您可能需要这样:
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
子句保证这些列为空。无聊。
其次,我不理解您的messages
和blockRequests
表格之间的关系。要使LEFT JOIN正常工作,必须在ON
子句中提及该关系。因此,我建议的ON
子句是猜测。