В запросе с объединенными таблицами, как задать предложение where, затрагивающее только одну строку, а не все строки, созданные соединением - PullRequest
2 голосов
/ 29 марта 2019

Я создал веб-приложение с php и базой данных mysql. Пользователи могут предлагать идеи или делать запросы, а администраторы сайта могут это проверить. Если все менеджеры подтвердили запрос, он принят.

У меня есть 4 таблицы в моей базе данных, одна для пользователей, одна для пользовательских запросов, одна для менеджеров и одна для потока проверок менеджера.

User
______
Id PK
Name
...

User_s_request
______________
Id PK
User_id
Request

Manager
_________
User_id PK

Manager_s_validation
____________________
User_request_id PK
Manager_id PK
Validation_date

Когда менеджер переходит на страницу проверки, я отображаю HTML-таблицу, показывающую запросы пользователя, которые все еще нуждаются в проверке этого менеджера.

SELECT ur.id from user_request AS ur
JOIN manager_validation AS mv ON mv.user_request_id = ur.id
JOIN manager AS m ON m.user_id = mv.manager_id
WHERE mv.manager_id != $manager_id OR mv.user_request_id IS NULL
LIMIT 1

Мой запрос работает, когда этот менеджер еще не подтвержден. Запрос отображается. Мой запрос работает, когда единственная проверка от этого менеджера. Но это не работает, если этот менеджер и еще один (или более) проверены. Запрос отображается, когда его не должно быть.

Как может быть правильный запрос?

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Мне кажется, что вы ищете NOT EXISTS, то есть выберите все запросы пользователей, для которых не существует проверки для определенного менеджера.

SELECT *
       FROM user_request ur
       WHERE NOT EXISTS (SELECT *
                                FROM manager_validation mv
                                WHERE mv.user_request_id = ur.id
                                      AND mv.manager_id = ?);
0 голосов
/ 29 марта 2019

Я нашел решение благодаря @sticky bit, вот оно:

SELECT *
   FROM user_request ur
   WHERE ur.id NOT IN 
       // I select the ids of the validated requests (by this manager)
       (SELECT mv.user_request_id
       FROM manager_validation mv
       WHERE mv.manager_id = ?);
// the users_s_request may be displayed several times (for each validation by a manager)
// so I limit the result to 1 only
LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...