Как выбрать отдельные строки и перекрестную проверку в другой таблице? - PullRequest
0 голосов
/ 06 июля 2019

У меня есть 3 таблицы, users и tasks и completed_tasks.Поэтому в основном я хочу выбрать все задачи, где user_id = 2 И также проверить, что задача не существует в другой таблице`. Вот мои таблицы:

users таблица:

+----+-------+
| id | name  |
+----+-------+
|  1 | John  |
|  2 | Sally |
+----+-------+

tasks таблица:

+----+-----------+---------+
| id | task_name | user_id |
+----+-----------+---------+
|  1 | mop floor |       2 |
|  2 | dishes    |       1 |
|  3 | laundry   |       2 |
|  4 | cook      |       2 |
+----+-----------+---------+

completed_tasks таблица:

+----+---------+---------+
| id | task_id | user_id |
+----+---------+---------+
|  1 |       1 |       2 |
+----+---------+---------+

Здесьмой текущий SELECT код для моей базы данных MySQL:

$db = "SELECT DISTINCT tasks.task_name, users.name FROM tasks LEFT JOIN ON users.id = tasks.user_id WHERE tasks.user_id = 2";

У меня проблема в том, что я хочу выполнить поиск в таблице completed_tasks, и если задача существует, то не выбирайтеэта задача.

Я попытался сделать это, добавив следующее, но это не сработало:

LEFT JOIN completed_tasks ON completed_tasks.user_id = 2

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

Я хочу, чтобы конечный результат возвращал имя пользователя и имя задачи 3 и 4.

Кроме того, производительность в моем приложении критическая .Я мог бы использовать PHP и перебирать массивы и делать SELECT для каждого из них, но это не было бы хорошо для производительности.

1 Ответ

0 голосов
/ 06 июля 2019

У вас есть несколько способов сделать это.

Вы можете использовать LEFT JOIN, а затем проверить наличие NULL в дополнительной таблице.

SELECT a.name, b.task_name
FROM users a
JOIN tasks b ON a.id = b.user_id
LEFT JOIN completed_tasks c ON c.task_id = b.id AND c.user_id = b.user_id
WHERE c.id IS NULL
;

Вы можете сделать NOT EXISTS подзапрос

SELECT a.name, b.task_name
FROM users a
JOIN tasks b ON a.id = b.user_id
WHERE NOT EXISTS (
    SELECT 1
    FROM completed_tasks c
    WHERE c.task_id = b.id AND c.user_id = b.user_id)
;
...