Sql 我能';I don’我不知道这个WHERE子句怎么用

Sql 我能';I don’我不知道这个WHERE子句怎么用,sql,Sql,我有一个(大的)SQL查询,但是我被困在了如何给WHERE部分添加单词上 我现在写的是这样的: 这并不能真正正常工作。 我想说的是,显示结果,除非在tbl_blocking.user或tbl_blocking.blocking列中出现“谁” 目前,所发生的一切,就是所有的结果都被显示出来并重复-两次 示例: [状态一!],[状态一!],[状态二!],[状态二!] 我相信看到整个查询也会有所帮助,因此它是: //Get status results $sql = "SELE

我有一个(大的)SQL查询,但是我被困在了如何给WHERE部分添加单词上

我现在写的是这样的:

这并不能真正正常工作。
我想说的是,显示结果,除非在tbl_blocking.usertbl_blocking.blocking列中出现“谁”

目前,所发生的一切,就是所有的结果都被显示出来并重复-两次

示例:

[状态一!],[状态一!],[状态二!],[状态二!]

我相信看到整个查询也会有所帮助,因此它是:

//Get status results
            $sql = "SELECT 

            tbl_status.id as statID, 
            tbl_status.from_user as statFROM, 
            tbl_status.status as statSTATUS, 
            tbl_status.deleted as statDEL, 
            tbl_status.date as statDATE,

            tbl_users.id as usrID, 
            tbl_users.name as usrNAME,
            tbl_users.location as usrLOCATION,
            tbl_users.postcode as usrPOSTCODE,

            tbl_blocking.id as blockID,
            tbl_blocking.user as blockUSER,
            tbl_blocking.blocking as blockBLOCKING,
            tbl_blocking.date as blockDATE,
            tbl_blocking.active as blockACTIVE,

            tbl_blocking2.id as blockID2,
            tbl_blocking2.user as blockUSER2,
            tbl_blocking2.blocking as blockBLOCKING2,
            tbl_blocking2.date as blockDATE2,
            tbl_blocking2.active as blockACTIVE2

            FROM tbl_status 

            LEFT JOIN tbl_users ON tbl_status.from_user = tbl_users.id
            LEFT JOIN tbl_blocking ON tbl_users.id = tbl_blocking.user
            LEFT JOIN tbl_blocking2 ON tbl_users.id = tbl_blocking2.user

            WHERE 
            tbl_status.deleted = '0'
            AND tbl_blocking.active = '0'
            AND (tbl_blocking.user != :who OR tbl_blocking.blocking != :who)

            ORDER BY 
            tbl_status.date desc

            LIMIT 200

            ";

我想这就是你想要的:

AND tbl_blocking.user <> :who AND tbl_blocking.blocking <> :who

如果您只想要在
tbl\u blocking.user
tbl\u blocking.blocking
中没有
:who
的项目,您只需要

AND tbl_blocking.user != :who
AND tbl_blocking.blocking != :who
……在那里


因为你本质上是说,“给我
用户
不是
的行:谁
,谁也不是
阻塞的行”

你想要两个条件都为真(即两个比较都不相等),所以你想要使用
操作符:

AND (tbl_blocking.user != :who AND tbl_blocking.blocking != :who)
您也可以使用
not
编写相同的代码:

AND NOT (tbl_blocking.user = :who OR tbl_blocking.blocking = :who)

(在布尔逻辑中,
(不是x)和(不是y)
相当于
不是(x或y)

所以。。啊,这让我很困惑。上述陈述是否意味着,确保:谁不出现在第1列或第2列中,还是意味着,确保它不同时出现在两列中?@ElainAdams。这意味着
:who
不在这两列中,它根本不会出现。当我用这里给出的任何答案替换我的代码行时,将不再输出任何结果。关于我做错了什么的建议?我不认为这会,因为我不是说确定:谁不是同时出现在两列中,我只是想检查它是出现在第1列还是第2列中。如果它出现在这些列中的任何一列中,请不要输出result@ElaineAdams这会奏效的。上面的检查是为了确保
:who
不在这两列中。它将忽略任何列中
:who
所在的所有行,无论它是在两列中还是仅在其中一列中。根据您的描述,这就是您想要的。无论我使用哪个答案来显示结果,更改me代码后都不会显示任何结果:(您是否检查过是否有值为
deleted=0
active=0
,而没有
:在
blocking
user
中谁
?我发现了问题,但不确定如何解决。用户必须已阻止另一个用户才能将其ID放入阻止选项卡中le.假设他们不是:谁,他们的状态显示。问题是,如果用户从未阻止过任何人…他们将永远不会将信息放入阻止表中。因此,状态将永远不会出现shownOK,似乎发生了一些事情。我使用的是you's AND not示例。现在,没有显示结果。但这一定是因为它只会显示用户的结果,如果他们已经阻止了某人并且他们的ID在阻止表中。所以我应该添加and或NULL扩展名?@elaineAddams:在
where
子句中有条件会将外部联接转换为内部联接。您应该将阻止表的条件从
where
移动到中连接的
子句上的ode>添加
和tbl_blocking.active='0'和tbl_blocking.user=:who)
到一个连接和
和tbl_blocking2.active='0'和tbl_blocking2.blocking=:who
到另一个。现在,当您从
tbl_blocking
tbl_blocking2
中选择数据时,如果阻塞表中没有匹配记录,则值将为空。您还可以在
中检查空值>子句。@elaineAddms:另外,您应该将状态表上的联接更改为
内部联接
,或者将该联接的条件移动到其
on
子句,这取决于状态表中没有相应记录时所需的结果。如果始终存在,请使用
内部联接
AND (tbl_blocking.user != :who AND tbl_blocking.blocking != :who)
AND NOT (tbl_blocking.user = :who OR tbl_blocking.blocking = :who)