0

我有一个viewCount专栏table_1。每次具有新 IP 地址的用户访问该页面时,我都会将viewCount列增加 1。这是为了记录有多少人访问了该页面。在表中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并增加 viewCount in table_1

我的问题是我怎样才能只进行 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]
            );
        }

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

4

1 回答 1

1

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

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只会使事情变得混乱并减慢速度。

于 2020-09-22T01:04:01.407 回答