首页 > 解决方案 > SQL 查询不等于运算符不工作,使用 JOIN

问题描述

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

我试图显示所有结果,除了表 2 中 userid 列等于 1 和 hidden 列等于 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 = 1和的结果uh.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

因此,如果我使用 and useridof 登录:

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

2我应该看到:MacD's、BK 和 Byron。

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

标签: phpmysqlsqlpdo

解决方案


如果我理解正确,表user_hidden_​​list 维护一个用户和他看不到的用户之间的关系。因此,例如,id 等于1的用户(在userid列上匹配)看不到用户12(在 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);

我敢肯定会有更好(优雅)的方法来做到这一点,但我刚下班,我的头脑现在不太好。


推荐阅读