【问题标题】:Table JOIN is not working as it is supposed to in mysql表 JOIN 不能像在 mysql 中那样工作
【发布时间】:2019-01-03 11:27:45
【问题描述】:

我有两张桌子,第一张是users_table,第二张是friends_table

users_table 包含用户的信息,包括banned 列,friends_table 是用户之间的友谊。

两个表都有user_id 列,所以我想要的是根据两个表中的条件检索特定用户的朋友数。条件为user_idbanned。我希望朋友的数量不包括被禁止的用户,但即使用户朋友被禁止,我仍然可以获得朋友总数。 请帮助我,这是我的查询,它们同时运行以检索朋友:

$query1 = "
    SELECT * 
    FROM users_table u 
    INNER JOIN friends_table f ON u.user_id = f.user_id 
    WHERE f.user_id = $user_id AND u.banned = 0
";

$query2 = "
    SELECT * 
    FROM users_table u 
    INNER JOIN friends_table f ON u.user_id = f.friend_id
    WHERE f.friend_id = $user_id AND u.banned = 0
";

编辑 “users_table”结构:

user_id
first_name
last_name
username
email
password
temporarily_banned
banned

“friends_table”结构:

friendship_id
user_id
friend_id
friendship_timestamp

表格记录示例

users_table 示例:

user_id: 20
first_name: Firas
last_name: Helou
username: firashelou
email: mac_987@hotmail.com
password: *******
temporarily_banned: 0
banned: 0

user_id: 30
first_name: Elie
last_name: Helou
username: eliehelou
email: elie@hotmail.com
password: *******
temporarily_banned: 0
banned: 1

user_id: 22
first_name: Jessy
last_name: Helou
username: jessyhelou
email: jessy@hotmail.com
password: *******
temporarily_banned: 0
banned: 1

user_id: 32
first_name: Jad
last_name: Helou
username: jadhelou
email: jad@hotmail.com
password: *******
temporarily_banned: 0
banned: 0

friends_table 示例:

friendship_id | user_id | friend_id | friendship_timestamp
10                20         30             1534342490
9                 20         22             1533484062
16                32         20             1541619611

【问题讨论】:

  • Query1 在我看来没问题....如果你给我们表结构,我们会告诉你哪里出了问题。
  • @XraySensei 我添加了表格结构
  • 你的friends_table是否以双向的方式记录每一个友谊?即 user1 和 user2 有朋友关系,所以有两条记录:一条记录​​ user1 是 user_id,user2 是friend_id,另一条记录 user2 是 user_id,user1 是friend_id
  • 不,如果用户 1 将用户 2 添加为好友,那么在friends_table user_id=user1 和friend_id=user2 中,获取好友的查询会检查2 次​​span>
  • 那么我认为@GMB 答案中的第二个查询是您的最佳选择,如果它适合您的数据。

标签: mysql sql database join left-join


【解决方案1】:

您需要在user 表上添加一个JOIN 以检查该朋友是否被禁止。

您的第一个查询变为:

SELECT * 
FROM users_table u 
INNER JOIN friends_table f ON f.user_id = u.user_id
INNER JOIN users_table uf ON uf.user_id = f.friend_id AND uf.banned = 0
WHERE u.user_id = $user_id

第二个查询:

SELECT * 
FROM users_table u 
INNER JOIN friends_table f ON f.friend_id = u.user_id
INNER JOIN users_table uf ON uf.user_id = f.user_id AND uf.banned = 0
WHERE u.user_id = $user_id 

还可以将两个查询合并为一个,例如:

SELECT * 
FROM users_table u 
LEFT JOIN friends_table f1 ON f1.friend_id = u.user_id
LEFT JOIN users_table uf1 ON uf.user_id = f1.user_id AND uf1.banned = 0
LEFT JOIN friends_table f2 ON f2.user_id = u.user_id
LEFT JOIN users_table uf2 ON uf2.user_id = f2.friend_id AND uf2.banned = 0
WHERE u.user_id = $user_id AND COALESCE(uf1.id, uf2.id) IS NOT NULL

PS:如果你只是在寻找count个朋友,你可以使用SELECT COUNT(*)而不是SELECT *

【讨论】:

  • 我试过你的查询,但它仍然给我朋友总数,不排除被管理员禁止的朋友
  • @firasprogrammer :我更新了我的答案,请检查
  • 我的查询现在是这样的,我收到一个错误 $query2 = "SELECT * FROM users_table u INNER JOIN friends_table f ON u.user_id = f.friend_id INNER JOIN user_tables uf ON uf.user_id = f.user_id AND uf.banned = 0 其中 f.friend_id = $user_id";
  • GMB 我添加了您发布的相同查询 2 但查询 1 应该是什么?
【解决方案2】:

你需要JOINusers表两次来判断好友是否被封禁。查询1:

SELECT *
FROM users_table u
JOIN friends_table f ON f.user_id = u.user_id
JOIN users_table u2 ON u2.user_id = f.friend_id
WHERE u.user_id = $user_id AND u2.banned = 0

对于您提供的示例数据,这给出了除了 user_id 32 之外没有朋友的预期结果。

查询 2:

SELECT *
FROM users_table u
JOIN friends_table f ON f.friend_id = u.user_id
JOIN users_table u2 ON u2.user_id = f.user_id
WHERE u.user_id = $user_id AND u2.banned = 0

对于您提供的示例数据,这给出了一组不同的结果,因为一些被禁止的用户有未被禁止的朋友。

Demo on dbfiddle

【讨论】:

  • 仍然没有运气,尝试了你的,同时在两个查询中,但我仍然得到朋友总数
  • @firasprogrammer 是您尝试的第二个查询,就像我刚刚添加到答案中的查询一样?
  • 是的,我又试了一次,仍然得到相同数量的朋友,我应该得到 1 个,而不是得到 3 个,其中 2 个被禁止
  • @firasprogrammer 从您的描述中,其中一个查询应该可以工作。您可能需要提供一些示例数据来解决这个问题
  • 提供的样本数据是什么意思?我应该把名字放在表中你的意思吗?
【解决方案3】:

您的查询似乎只是检查用户本身是否被禁止。 您需要为“朋友”添加另一个联接到用户表中,以检查他们的状态:

***假设:friend_table 只是一个没有“禁止”列的链接表

SELECT * 
FROM users_table user 
INNER JOIN friends_table f ON u.user_id = f.user_id
INNER JOIN users_table friend on friend.user_id = f.user_id
WHERE f.user_id = $user_id AND 0 NOT IN (u.banned, friend.banned)

SELECT * 
FROM users_table u 
INNER JOIN friends_table f ON u.user_id = f.friend_id
INNER JOIN users_table friend on friend.user_id = f.user_id
WHERE f.friend_id = $user_id AND 0 NOT IN (u.banned, friend.banned)

【讨论】:

  • 我添加了表格结构,我在他的个人资料页面广告上列出了用户的朋友,也显示了朋友的数量,所以我想要登录的用户只看到未被禁止的朋友
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多