Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据另一个表中的数据选择数据_Mysql - Fatal编程技术网

Mysql 根据另一个表中的数据选择数据

Mysql 根据另一个表中的数据选择数据,mysql,Mysql,我有两张桌子: |id| username | ------------------- |1 |John Doe | |2 |Jane Doe | |3 |Luke Skywalker| |id|user_id|group_id| --------------------- |1 |1 |5 | |2 |1 |6 | |3 |2 |6 | 我正在尝试筛选组中已经存在的用户,以便同一用户不能添加两次到

我有两张桌子:

|id| username     |
-------------------
|1 |John Doe      |
|2 |Jane Doe      |
|3 |Luke Skywalker|

|id|user_id|group_id|
---------------------
|1 |1      |5       |
|2 |1      |6       |
|3 |2      |6       |
我正在尝试筛选组中已经存在的用户,以便同一用户不能添加两次到同一组

我如何从表1中选择所有不在表2中组\u id=5中的用户?

您可以使用:

SELECT u.*
FROM table1 u
WHERE NOT EXISTS (
    SELECT 1
    FROM table2 g
    WHERE g.user_id = u.id AND g.group_id = 5
)
SELECT * FROM table1 WHERE id NOT IN (SELECT user_id FROM table2 WHERE group_id=5)
但是,为了确保唯一性,您最好在表2中的
(user\u id,group\u id)
上添加一个唯一键:

ALTER TABLE table2 ADD UNIQUE KEY unique_user_group (user_id, group_id);
这样,MySQL本身就不会接受重复记录,而不必每次在应用程序端进行检查。

您可以使用:

SELECT * FROM table1 WHERE id NOT IN (SELECT user_id FROM table2 WHERE group_id=5)
但是,为了确保唯一性,您最好在表2中的
(user\u id,group\u id)
上添加一个唯一键:

ALTER TABLE table2 ADD UNIQUE KEY unique_user_group (user_id, group_id);

这样,MySQL本身就不会接受重复记录,而不必每次都在应用程序端进行检查。

您需要在where子句中使用join子句和。假设他们是在用户id上加入的,这应该可以工作

这将为您提供两个表的结果,表2中的结果不等于5

SELECT  *
  FROM   table1 t1
  INNER JOIN table2 t2 ON t2.user_id = t1.id
   WHERE   t2.group_id <> 5
选择*
来自表1 t1
t2.user_id=t1.id上的内部联接表2 t2
其中t2.u组id 5

您需要在where子句中使用带有in的join子句。假设他们是在用户id上加入的,这应该可以工作

这将为您提供两个表的结果,表2中的结果不等于5

SELECT  *
  FROM   table1 t1
  INNER JOIN table2 t2 ON t2.user_id = t1.id
   WHERE   t2.group_id <> 5
选择*
来自表1 t1
t2.user_id=t1.id上的内部联接表2 t2
其中t2.u组id 5

IN通常比EXISTS慢。如果发现一条记录,EXISTS就会停止,而in子句中的子查询总是选择所有记录。这样做更优雅,性能可能对他/她来说也不太重要。好的一点是,在中使用
时,子查询不是只运行一次,而不是针对每条记录运行一次吗?正确。但是,如果子查询返回大量数据,则会影响性能。中的性能通常比现有的慢。如果发现一条记录,EXISTS就会停止,而in子句中的子查询总是选择所有记录。这样做更优雅,性能可能对他/她来说也不太重要。好的一点是,在
中使用
时,子查询不是只运行一次,而不是针对每条记录运行一次吗?正确。但是如果子查询返回大量数据,则会影响性能。您在下面的答复中找到答案了吗?您在下面的答复中找到答案了吗?