如何避免不向特定表中的用户显示行

时间:2018-10-10 19:15:12

标签: mysql mysqli

我正在创建一个网站,用户可以在其中发布链接并与之互动。

将为所有用户显示一个包含所有用户链接的表。

但是我需要问一个问题,因为当用户与链接交互时,该链接将不会再次显示。 也就是说,当用户单击链接时,该链接仅对于单击的用户消失

我已经完成了以下工作。

我有存储所有用户的表(用户)。

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

这是存储所有链接的第二张表

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

现在假设(表1的USER2(用户))单击了以下链接(表2的URL1和URL2(链接))。

当用户单击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 :(得分:0)

我进行了下一个查询,它将返回可供每个用户使用的一组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;

答案 1 :(得分:0)

我知道了。如果有人对未来感兴趣,这是正确的答案。

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')