我有这些桌子...
GROUP_MEMBERS
+---------------------------------+
| id | group_id | member_id |
+---------------------------------+
| 1 | 1 | 1 |
| 2 | 1 | 4 |
+---------------------------------+
会员
+-------------------------------------+
| id | first | last | role_id |
+-------------------------------------+
| 1 | Jack | Jones | 1 |
| 2 | Jane | Doe | 2 |
| 3 | Bob | Bee | 2 |
| 4 | Jen | Nee | 1 |
+-------------------------------------+
组
+-----------------+
| id | name |
+-----------------+
| 1 | group1 |
| 2 | group2 |
+-----------------+
实际上,我正在使用以下查询...
SELECT
(members.id) AS memid,
members.first,
members.last,
members.role_id
FROM
members
LEFT JOIN group_members ON
members.id = group_members.member_id
WHERE
group_members.member_id IS NULL
GROUP BY
members.id;
这将按原样输出不在“ GROUP_MEMBERS”表中的成员(Jane和Bob),但是我要开始工作的是如果我在和另一个($_GET['group_id'])
组,该如何显示所有成员在'GROUP_MEMBERS'表上没有与group_id
和member_id
匹配的行...
即如果group_id = '2'
显示所有成员
我尝试在WHERE子句中添加... AND group_members.group_id为NULL ..但随后什么也没显示。
有人有查询可以获取我想要的输出吗? 谢谢
[编辑]
只是澄清一下...
如果我的网址中包含“ group_id = 1”
我应该看到:
Bob
Jane
如果我的网址中包含“ group_id = 2”
我应该看到:
Jack
Jane
Bob
Jen
因此,它仅在“ GROUP_MEMBERS”表中显示不存在的“成员”(URL中带有“ group_id”)
答案 0 :(得分:1)
如果我正确理解了这个问题,那么您正在寻找类似我在这个小提琴中所做的事情:
DB Fiddle
我使用的查询是:
$sql = 'SELECT * FROM groups
RIGHT JOIN group_members ON groups.id = group_id
RIGHT JOIN members ON member_id = members.id
WHERE group_id <> ? OR group_id is NULL;'
$group_id = $_GET['group_id'];
$query = $mysqli->prepare($sql);
$query->bind_param('i', $group_id);
简而言之,此查询将从“组”表中进行选择,以确保我们将选择数据库中的每个组。
然后,我们将完全连接其他两个表(使用RIGHT JOIN
)。
最后,我们将选择不是指定的URL所提供的每个成员,或不在组中的任何成员。
答案 1 :(得分:0)
您可以使用子查询
如何显示所有不具有与“ group_id”匹配的行的成员
$group_id= $_GET['group_id'];
$q = "SELECT * FROM MEMBERS WHERE MEMBERS.id NOT IN(
SELECT member_id FROM GROUP_MEMBERS WHERE group_id='$group_id'
);";
说明
SELECT member_id FROM GROUP_MEMBERS WHERE group_id='$grID'
这将通过给定的ID获取该组中的所有成员 然后选择不在其中的所有成员。
SELECT * FROM MEMBERS WHERE MEMBERS.id NOT IN()
这将为成员提供除括号内的ID之外的数据 子查询将获取给定组中成员的ID 无需加入三个表,因为您使用的是GROUP_MEMBERS中存在的组的ID并链接了GROUP和MEMBERS
旁注
如果您有一个组名以及该组中没有的所有用户,则需要使用GROUPS表
SELECT * FROM MEMBERS WHERE MEMBERS.id NOT IN(
SELECT member_id FROM GROUP_MEMBERS WHERE group_id = (
SELECT id from GROUPS WHERE name = '$Group_Name'
)
);
您可以使用WHERE group_id IN (...)
,它会起到相同的作用
这是一个演示,我用相同的数据创建了相同的数据库并测试了查询
+----+-------+-------+---------+ | id | first | last | role_id | +----+-------+-------+---------+ | 1 | Jack | Jones | 1 | | 2 | Jane | Doe | 2 | | 3 | Bob | Bee | 2 | | 4 | Jen | Nee | 2 | +----+-------+-------+---------+ +----+--------+ | id | name | +----+--------+ | 1 | group1 | | 2 | group2 | +----+--------+ +----+----------+-----------+ | id | group_id | member_id | +----+----------+-----------+ | 1 | 1 | 1 | | 2 | 1 | 4 | +----+----------+-----------+
我如上所述运行子查询,并按预期运行结果,
MariaDB []> select * from members where id not in
(select member_id from group_members where group_id = 1);
+----+-------+------+---------+ | id | first | last | role_id | +----+-------+------+---------+ | 2 | Jane | Doe | 2 | | 3 | Bob | Bee | 2 | +----+-------+------+---------+
具有组名时类似
MariaDB []> select * from members where id not in
(select member_id from group_members where group_id =
(select id from groups where name='group1'));
+----+-------+------+---------+ | id | first | last | role_id | +----+-------+------+---------+ | 2 | Jane | Doe | 2 | | 3 | Bob | Bee | 2 | +----+-------+------+---------+