我想知道是否有人可以帮助我进行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 = 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
因此,如果我使用的userid
和
1
我应该看到:BK和拜伦。
2
我应该看到:MacD,BK和拜伦。
3
(或其他任何东西),我应该看到:Jacks,MacD,BK和Byron。
答案 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);
我猜测userid
和hidden
是某种数字,因此我删除了单引号。如果它们确实是字符串,请使用单引号。
这还假定这些值不能为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);