我无法弄清楚如何说出这个WHERE子句

时间:2014-03-03 20:06:13

标签: sql

我有一个(大)SQL查询,但是我不知道怎么写 WHERE 部分。

我目前的编写方式如下:

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

哪个方法工作不正常。
我想说,显示结果 UNLESS ':谁出现在tbl_blocking.user OR tbl_blocking.blocking列

目前,所有这些都在发生,所有结果都被提出并重复 - TWICE

示例:

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

我确信看到整个查询也会有所帮助,所以这就是:

//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

            ";

3 个答案:

答案 0 :(得分:0)

我认为这就是你想要的:

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

也就是说,您不希望任何一列中都有:who

编辑:

您的逻辑陈述是:

  • 显示结果“UNLESS”:谁出现在tbl_blocking.user或tbl_blocking.blocking列中

这是一步一步的转变:

  • 显示结果UNLESS(:谁出现在tbl_blocking.user或:谁出现在tbl_blocking.blocking列中)

  • 显示结果UNLESS(tbl_blocking.user =:who或tbl_blocking.blocking =:who)

  • 显示结果WHERE NOT(tbl_blocking.user =:who或tbl_blocking.blocking =:who)

  • 显示结果WHERE tbl_blocking.user&lt;&gt; :谁和tbl_blocking.blocking&lt;&gt; :谁

编辑II:

如果值可以是NULL

AND coalesce(tbl_blocking.user, '<null>') <> :who AND coalesce(tbl_blocking.blocking, '<null>') <> :who

答案 1 :(得分:0)

如果您只想要 :who tbl_blocking.user中没有tbl_blocking.blocking的项目,您只需要。 ..

AND tbl_blocking.user != :who
AND tbl_blocking.blocking != :who

...有

因为您实际上在说“给我user不是:who <{1}}的行。”

答案 2 :(得分:0)

您希望两个条件都为真(即两个比较都不相等),因此您希望使用and运算符:

AND (tbl_blocking.user != :who AND tbl_blocking.blocking != :who)

您也可以使用notor

撰写相同内容
AND NOT (tbl_blocking.user = :who OR tbl_blocking.blocking = :who)

(在布尔逻辑(not x) and (not y)中相当于not(x or y)。)