使用JOIN的SQL查询不等于运算符不起作用

时间:2018-10-16 20:49:11

标签: php mysql sql pdo

我想知道是否有人可以帮助我进行SQL查询。

我试图显示所有结果,但在表2中,userid列等于1,而隐藏列等于1。

我基本上是在根据用户的id和隐藏列中的值1或为空来向各个用户隐藏结果。

到目前为止,我已经设法做出了一个相反的查询,却无法弄清楚如何更改它。我尝试添加!=<>NOT和其他一些内容,但是没有任何效果对我有用!

这是我正在使用的查询。

$stmt = $conn->prepare("SELECT tl.id, tl.name, tl.locale, uh.hidden 
  FROM theList AS tl 
  LEFT JOIN user_hidden_list AS uh ON uh.est_id = tl.id 
  WHERE uh.userid = '1' AND uh.hidden = '1'");

如何显示所有期望结果为uh.userid = 1uh.hidden = 1的结果

更新:表格

表格:user_hidden_list

 userid | Hidden | est_id
---------------------------
   1    | 1      |   1
   2    | 1      |   1
   1    | 1      |   2

表格:theList

id |    name  | locale
------------------------
 1 |    Jacks   |   LDN
 2 |    MacD's  |   LDN
 3 |    BK      |   LDN
 4 |    Byron   |   LDN

因此,如果我使用的userid

登录

1我应该看到:BK和拜伦。

2我应该看到:MacD,BK和拜伦。

3(或其他任何东西),我应该看到:Jacks,MacD,BK和Byron。

3 个答案:

答案 0 :(得分:1)

如果我正确理解,表 user_hidden_​​list 会在一个用户和他看不到的用户之间建立关系。因此,例如,id为 1 的用户(与 userid 列匹配)无法看到用户 1 2 < / strong>(与est_id列匹配)。

因此,对于具有 ID = X 的特定用户,我们可以获得下一个看不见的用户的 ID 列表:

SELECT
    est_id
FROM
    user_hidden_list
WHERE
    userid = X AND hidden = 1;

使用上一个查询,我们可以为用户 X 获得可见的用户,就像在下一个查询中一样:

SELECT
    tl.id, tl.name, tl.locale
FROM
    theList AS tl
WHERE
    tl.id NOT IN (SELECT est_id
                  FROM user_hidden_list
                  WHERE userid = X AND hidden = 1);

我敢肯定会有更好(优雅)的方法来做到这一点,但我只是下班了,现在我的思想还不好。

答案 1 :(得分:0)

  

我试图显示所有结果,但在表2中,userid列等于1,而隐藏列等于1。

这并不建议使用外部join。您似乎想要:

SELECT tl.id, tl.name, tl.locale, uh.hidden 
FROM theList tl JOIN
      user_hidden_list uh
      ON uh.est_id = tl.id 
WHERE NOT (uh.userid = 1 AND uh.hidden = 1);

我猜测useridhidden是某种数字,因此我删除了单引号。如果它们确实是字符串,请使用单引号。

这还假定这些值不能为NULL。如果有可能,则可以调整逻辑(使用空安全比较器<=>)。

答案 2 :(得分:0)

甚至连括号也可以尝试一下:

SELECT tl.id, tl.name, tl.locale, uh.hidden 
FROM theList tl JOIN
      user_hidden_list uh
      ON uh.est_id = tl.id 
WHERE (uh.userid <> 1 AND uh.hidden <> 1);