如何选择在 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 【问题描述】:我正在使用 php 和 mysql 开发一个聊天应用程序。 我有 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