如何检查2个值是否为NULL

时间:2019-03-04 13:02:23

标签: php mysqli

我有这些桌子...

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_idmember_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”)

2 个答案:

答案 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 |
+----+-------+------+---------+