根据另一个表中的列表筛选MySQL表结果

时间:2016-04-18 15:54:46

标签: php mysql sql

我有一个表,它以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;

CC BY-NC-SA 3.0

我的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

这为我提供了连接表,但没有过滤被阻止的用户,我仍然在结果集中看到它们。

2 个答案:

答案 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中的一行或多行相匹配的行。 修改:您可以根据需要使用WHEREAND子句添加其他条件。

请注意:您的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子句保证这些列为空。无聊。

其次,我不理解您的messagesblockRequests表格之间的关系。要使LEFT JOIN正常工作,必须在ON子句中提及该关系。因此,我建议的ON子句是猜测。