如何选择在 table1 中有值但在 table2 中为 NULL 的字段表?

Posted

技术标签:

【中文标题】如何选择在 table1 中有值但在 table2 中为 NULL 的字段表?【英文标题】:How can I select a field table that has a value in table1 but is NULL in table2? 【发布时间】:2021-08-14 05:28:04 【问题描述】:

我正在使用 phpmysql 开发一个聊天应用程序。 我有 4 个表:users、friend_request、friends 和 chats。 当用户单击“添加朋友”按钮时,我想显示“用户”表中与用户不是朋友的所有成员(来自“朋友”表)。 好友表=friend_id user_id dat

下面是我的代码

SELECT * 
FROM users as t1 
LEFT JOIN friends as t2 
  ON (t1.user_id = t2.friend_id) OR (t1.user_id = t2.user_id)
WHERE t2.user_id IS NULL;

返回

user_id* ++++ username ++++ email ++++ password ++++ gender ++++  country  ++++ status ++++ last_seen ++++ friend_id ++++  *user_id* ++++ dat**

2 wayne pro@ab.com ********* male  Nigeria 0 2021-08-13 6:31 NULL NULL 2021-08-12 1:58

1 rooney shot@ab.com ********* male  Nigeria 0 2021-08-13 6:32 NULL NULL 2021-08-12 2:00

每条记录都按预期显示,但friend_id 和 user_id(我猜来自friends 表)为NULL。

现在的问题是,我尝试使用 PHP 输出 user_id 的值(从第一个 user_id 的值分别为 2 和 1),但它似乎是空的。 我哪里弄错了?我是新手。

【问题讨论】:

列名真的是user_I'd吗?因为那行不通。 friend_I'd 也是如此。 其实分别是user_id和friend_id。我的键盘开启了自动更正功能 【参考方案1】:

您需要为列 (user_id) 设置别名,就像您将表名别名为 t1 和 t2 一样。因为,这两个表都有具有相同列名的列。您可以在查询中尝试这样的操作:

SELECT t1.user_id as main_user_id

在 php 中,您需要使用main_user_id,而不是使用user_id

【讨论】:

【参考方案2】:

删除这个条件WHERE t2.user_id IS NULL;你的查询

SELECT * 
FROM users as t1 LEFT JOIN friends as t2 ON (t1.user_id = t2.friend_id) OR (t1.user_id = t2.user_id)

【讨论】:

【参考方案3】:

您的问题的直接解决方案是仅从第一个表中选择列:

select t1.*

换句话说,不要将friends 表中的列包含在结果集中。这样就不会有混乱了。

一般来说,应该避免使用select * —— 甚至使用表别名。您应该只选择您需要的列。这是为了保护您的代码免受将来表更改的影响。

也就是说,您的代码似乎缺少当前用户的条件。我会

SELECT u.*
FROM users u
WHERE NOT EXISTS (SELECT 1
                  FROM friends f
                  WHERE (u.user_id, ?) IN ( (f.user_id, f.friend_id), (f.friend_id, f.user_id) )
                );

? 是当前用户的参数占位符。

还要注意使用有意义的表别名,它们是表名的缩写,使查询更易于阅读。

【讨论】:

以上是关于如何选择在 table1 中有值但在 table2 中为 NULL 的字段表?的主要内容,如果未能解决你的问题,请参考以下文章

从 table1 中检索数据,但在 table2 中进行比较 - Laravel eloquent

根据table2选择table1中列的总和? [复制]

sqlite python 插入

从 table1 中选择不在 table2 中的列

我想要一个查询从 table2 中选择超过 4 个 AccountId 重复,在 table1 中具有不同的名称

SQL join:当值不在一组值中时如何选择