MySql как создать таблицы или сделать запрос?

может я перетрудился, или мозг сплавился.

вопрос следующего характера: имеются задания, т.е. одна таблица. из нее делается выобрка для вывода этих заданий. заданий очень много. примерно 100 000, адльше еще база расти будет....

если пользователь нажимает "не показывать данное задание никогда" - оно пропадает. как сделать запрос или построить таблицы чтобы это задание больше не выиралось из общей таблицы?
  • Вопрос задан
  • 196 просмотров
Решения вопроса 1
paveluho
@paveluho Автор вопроса
решение сделал таким:
WHERE NOT EXISTS (подзапрос SELECT на схожесть одинаковых id = pid)

подзапрос гораздо быстрее сработал, и надежно получилось.

WHERE `ex`.`id_задания` IS NULL, меня смутило почему то данное решение. не знаю почему, но слишком трудоемко, и тем более вводить допустим широкомосштабно сверку полей - очень сложно будет, если еще есть внешние сравнения из одной базы под условием WHERE.... может в чем то не прав. но для меня более лучше найти решение, которое гибкость обьявит внутри конструирования приложения

по поводу EXCEPT - не на всех хостингах работает. что опять будет багом для приложения.

единственный выбор на котором четко остановился - это сделать подзапрос в другую БД, и посчитал более надежным способом.

Всем спасибо за участие в данном вопросе!!!

Благодарю
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
DMShamonov
@DMShamonov
Frontend developer
Нужно где то хранить связку "пользователь" - "не отображаемые задания", ну и в запросе получения списка заданий исключать отменённые пользователем.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Таблица исключений с полями `id пользователя`, `id задания`, образующими первичный ключ. В запросе
LEFT JOIN (
    SELECT `id_задания` 
        FROM `таблица_исключений` 
        WHERE `id_пользователя` = :user_id
    ) AS `ex` ON `ex`.`id_задания` = `таблица_заданий`.`id_задания`
...
    WHERE `ex`.`id_задания` IS NULL
Ответ написан
Комментировать
Альтернативный LEFT JOIN-у вариант - оператор EXCEPT, который представляет собой операцию "минус" на множестве кортежей: en.wikipedia.org/wiki/Set_operations_%28SQL%29#EXC... . Т.е. вы выбираете все задания, и исключаете те, которые нужно... исключить:
select task.id from task
except select excluded_task.id from excluded_task
    where user_id = <id юзера>


Таблица excluded_task это пары (id, user_id) - если юзер исключил таск с некоторым id, в этом отношении будет соответствующий кортеж.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы