Как проверить, что 2 значения NULL - PullRequest
0 голосов
/ 04 марта 2019

У меня есть эти таблицы ...

GROUP_MEMBERS

+---------------------------------+
|  id  |  group_id  |  member_id  |
+---------------------------------+
|  1   |  1         |  1          |
|  2   |  1         |  4          |
+---------------------------------+

MEMBERS

+-------------------------------------+
|  id  |  first  |  last  |  role_id  |
+-------------------------------------+
|  1   |  Jack   |  Jones |  1        |
|  2   |  Jane   |  Doe   |  2        |
|  3   |  Bob    |  Bee   |  2        |
|  4   |  Jen    |  Nee   |  1        |
+-------------------------------------+

GROUPS

+-----------------+
|  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', как следует, но я пытаюсь получить работу, если яи другая группа ($_GET['group_id']), как я могу показать всех членов, у которых нет строк, которые соответствуют group_id и member_id в таблице 'GROUP_MEMBERS' ... т.е. если group_id = '2' показать всех членов

Я попытался добавить в предложение WHERE ... И group_members.group_id IS NULL ... но тогда ничего не отображается.

У кого-нибудь есть запрос, который получит вывод, который я ищу?Спасибо

[отредактировано]

Просто чтобы уточнить ...

Если мой URL имел 'group_id = 1'

Iдолжен увидеть:

Bob
Jane

Если мой URL имеет 'group_id = 2'

, я должен увидеть:

Jack
Jane
Bob
Jen

Таким образом, он показывает только «членов», которые несуществует (с 'group_id' в URL) в таблице 'GROUP_MEMBERS'

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Если я правильно понял вопрос, вы ищете что-то вроде того, что я сделал на этой скрипке:
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-адресе, или любого участника, которого нет в группе.

0 голосов
/ 04 марта 2019

Вы можете использовать подзапрос

, как показать все элементы, у которых нет строк, соответствующих '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'

это позволит получить всех членов этой группы по заданному идентификатору, а затем вы выберете всех участников, которых нет среди них.

SELECT * FROM MEMBERS WHERE MEMBERS.id NOT IN()

этот дастДанные членов, за исключением идентификаторов внутри скобок, подзапрос получит идентификаторы членов в данной группе, нет необходимости присоединяться к трем таблицам, так как вы используете идентификатор группы, существующей в GROUP_MEMBERS, и связываете GROUP и MEMBERS

примечание на одну сторону

если у вас есть имя группы и то, что всем пользователям, не входящим в эту группу, вам нужно будет использовать таблицу ГРУПП

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 |
+----+-------+------+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...