如果 IP 地址存在于另一个 table MYSQL 中,则在一个 table 中增加计数器列

increment counter column in one table if ip address exists in another table MYSQL

我在 table_1 中有一个 viewCount 列。每次有新 ip 地址的用户访问该页面时,我都会将 viewCount 列增加 1。这是为了记录有多少人访问了该页面。在 table table_2 中,我将用户的 IP 地址以及行的 ID 保留在 table_1 中。以下是我进行更新查询时列的外观和可能的场景案例,我目前正在尝试对其进行优化。

tabel_1:

------------------
| id | viewCount |
------------------
| 1  |   35      |
------------------

table_2:

----------------------
| tb1_id | ipAddress |
----------------------
|   1    | 0.1.0.1   |
----------------------

可能的场景: IP 地址为 0.1.0.0 的用户访问该页面。我查询 table_2 以查看是否存在包含 tb1_id 和当前用户 IP 地址的行。如果不是,我将不存在的用户的 IP 地址保存到 table_2 并在 table_1.

中增加 viewCount

我的问题是如何只进行 1 次查询(即访问数据库一次)并执行此操作?

这是我想出的代码,但是,虽然工作得很好,但它需要不止 1 趟

        const [rows] = await db.query(
            `
            SELECT 
                ipAddress
            FROM
                PageViews
            WHERE
                ipAddress = ?
            `,
            ['ipAddress']
        );
        if (rows.length === 0) {
            await db.query(
                `
                INSERT INTO
                    PageViews
                SET
                    projectId = ?
                AND
                    ipAddress = ?
                `,
                [projectId, ipAddress]
            );
            await db.query(
                `
                UPDATE
                    Project
                SET 
                    viewCount = viewCount + 1
                WHERE
                    id = ?
                `,
                [projectId]
            );
        }

任何有助于提高代码效率和减少访问数据库的帮助都将不胜感激

除非我错过了一个要求,否则我认为你工作太努力了。考虑一下:

CREATE TABLE vc (
    ip VARCHAR(15) CHARSET ascii,
    ctr INT UNSIGNED,
    PRIMARY KEY(IP)
) ENGINE=InnoDB;

INSERT INTO vc (ip, ctr)
    VALUES (?, 1)               -- Does INSERT when new IP
    ON DUPLICATE KEY UPDATE ctr = ctr + 1;  -- or Increments when existing

AUTO_INCREMENT 只会变得混乱并拖慢速度。