Как можно сделать, чтобы не показывать строки пользователям, которые находятся в определенной таблице - PullRequest
0 голосов
/ 10 октября 2018

Я создаю веб-сайт, где пользователи могут публиковать ссылки и взаимодействовать с ними.

Всем пользователям показана таблица со всеми ссылками пользователей.

Но мне нужно спроситьвопрос, когда пользователь взаимодействует со ссылкой, эта ссылка больше не будет отображаться.То есть, когда пользователь нажимает на ссылку, ссылка исчезает только для пользователя, который нажал

. Я сделал следующее.

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

Table1 (users):
----------------
| id | username |
----------------
|  1 |  user1   |
----------------
|  2 |  user2   |
----------------
|  3 |  user3   |
----------------

Это вторая таблица, в которой хранятся все ссылки

Table2 (links):
----------------
| id | urls |
----------------
|  1 |  url1   |
----------------
|  2 |  url2   |
----------------
|  3 |  url3   |
----------------

Теперь предположим, что (USER2 из таблицы 1 (пользователи)) нажали на следующие ссылки (URL1и URL2 таблицы2 (ссылки)).

Когда пользователь нажимает на URL, в третьей таблице сохраняются следующие значения следующим образом:

Table3 (blockuser):
-----------------------
| id | idLinks | users |
-----------------------
|  1 |    1    | user2 |
------------------------
|  2 |    2    | user2 |
-----------------------

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

        User1:                    User2:                   User3:
--------------------      --------------------     --------------------
| TABLE: ALL LINKS |      | TABLE: ALL LINKS |     | TABLE: ALL LINKS |
--------------------      --------------------     --------------------
|  ID   |  URLS    |      |  ID   |  URLS    |     |  ID   |  URLS    |
--------------------      --------------------     --------------------
|  1    |  url1    |      |  3    |  url3    |     |  1    |  url1    | 
--------------------      --------------------     --------------------
|  2    |  url2    |                               |  1    |  url2    |
--------------------                               --------------------
|  3    |  url3    |                               |  1    |  url3    |
--------------------                               --------------------

И вот чего я смог достичь.

        User1:                    User2:                   User3:
--------------------      --------------------     --------------------
| TABLE: ALL LINKS |      | TABLE: ALL LINKS |     | TABLE: ALL LINKS |
--------------------      --------------------     --------------------
|  ID   |  URLS    |      |  ID   |  URLS    |     |  ID   |  URLS    |
--------------------      --------------------     --------------------
|  3    |  url3    |      |  3    |  url3    |     |  3    |  url3    | 
--------------------      --------------------     --------------------

То есть, когда пользователь нажимает на ссылку, ссылкабольше не отображается для всех пользователей.

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

Это код, который я должен показать в таблице:

SELECT
    *
FROM
    links
LEFT JOIN
    blockuser ON blockuser.idLinks = links.id
WHERE
    blockuser.idLinks IS NULL

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Я получил это.Это правильный ответ, если кто-то заинтересован в будущем.

SELECT *
FROM links
WHERE id NOT IN
(SELECT idLinks FROM blockuser WHERE idUsers = 2)

или

SELECT *
FROM links
WHERE id NOT IN
(SELECT idLinks FROM blockuser WHERE users = 'user2')
0 голосов
/ 10 октября 2018

Я сделал следующий запрос, он вернет набор URL, доступных для каждого пользователя.

SELECT
    users.username, GROUP_CONCAT(links.urls) AS availableWebsites
FROM
    users
CROSS JOIN
    links
LEFT JOIN
    blockuser ON blockuser.idLinks = links.id AND blockuser.users = users.username
WHERE
    blockuser.idLinks IS NULL
GROUP BY
    users.id, users.username;

Пример вывода для вашего набора:

username availableWebsites
user1    url2,url1,url3
user2    url3
user3    url1,url3,url2

ОБНОВЛЕНИЕ

После прочтения обновлений по вашему вопросу и внесения некоторых изменений в предыдущий запрос вы можете получить таблицу с отношениями пользователей и URL-адресами, к которым они могут получить доступ в определенное время, например, так::

SELECT
    users.username, links.urls AS availableLink
FROM
    users
CROSS JOIN
    links
LEFT JOIN
    blockuser ON blockuser.idLinks = links.id AND blockuser.users = users.username
WHERE
    blockuser.idLinks IS NULL

Пример вывода для этого запроса:

username availableLink
user1    url1
user1    url2
user1    url3
user2    url3
user3    url1
user3    url2
user3    url3

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

SET @user = "user1";

SELECT
    users.username, links.urls AS availableLink
FROM
    users
CROSS JOIN
    links
LEFT JOIN
    blockuser ON blockuser.idLinks = links.id AND blockuser.users = users.username
WHERE
    blockuser.idLinks IS NULL
AND
    users.username = @user;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...