1

我是 MySQL 的初学者,我遇到了一些问题。我有两张桌子。其中一个被调用core并具有 200.000 个条目并包含该列messageid。另一个表称为,有 1.200.000 个条目并recipients具有列recipientid和。messageidpersonid

我正在personidcore中创建一个新列,以便导入两列中相同的personid条目。messageid我知道在表中recipients,有多个条目messageid,所以我只想返回第一个。我正在使用以下 sql 查询:

UPDATE core A
SET personid =
(SELECT personid
FROM recipients B
WHERE B.messageid = A.messageid)

我不明白为什么,但它不起作用。我想从其他表导入数据时工作,但不是这个表。最终,它只会使我的本地 php/mysql 服务器崩溃。

你对如何做到这一点有任何想法吗?

更新:

这是 SHOW INDEX FROM 收件人的结果。列名“recipientid”的基数为 1356207,索引类型为 BTREE。列名“messageid”的基数为“NULL”,索引类型为 BTREE。

当我运行 SHOW INDEX FROM core 时,查询运行成功,但没有显示任何内容。这是否意味着有问题?

4

2 回答 2

0

第 0 部分 - 在你做任何其他事情之前......

...您需要能够在core不超时或使服务器崩溃的情况下执行查询。根据您更新的问题,您可能必须创建一些索引core以帮助加快对其的查询(否则数据库必须扫描整个表以确保它做正确的事情)。至少,索引messageid应该有助于:

ALTER TABLE core ADD INDEX messageid_idx(messageid);

messageid 上的这个索引应该有助于加快对该列进行操作的任何查询,例如更新查询。

我的其余答案将分为两部分。首先,您的问题的答案,您确定要忽略 multiple personid's per messageidin recipients

我的答案的第二部分包含额外的查询,我将预先执行这些查询来分析 multiplepersonid以确定它们是否真的重要。也许您真的确定 multiplepersonid的 permessageid没什么大不了的,但是希望这将有助于其他寻求与您类似的问题的答案的人。

第 1 部分:任何人都可以,谢谢

对于具有多个personidper的收件人messageid,我们将让数据库引擎决定personid使用哪个进行更新:

-- Update core personid with recipients personid where messageid matches
UPDATE
    core
    INNER JOIN (
        SELECT
            messageid,
            personid
        FROM
            recipients
        GROUP BY
            messageid
    ) AS one_message_per_person USING (messageid)
SET
    core.personid = one_message_per_person.personid

很简单,对吧?好的,让我们继续。

第 2 部分:实际上,我对那些多人的消息很感兴趣。他们是哪些?

如果您只想知道哪些messageid' 与多个personid' 相关联,您可以使用以下命令查询它们:

-- Find messageids with more than one personid
SELECT
    messageid,
    personid,
    COUNT(DISTINCT personid) AS num_people_in_message
FROM
    recipients
GROUP BY
    messageid
HAVING
    num_people_in_message > 1

如果您还想查看personid与他们关联的个人,可以使用以下查询。注意,会有重复messageid的,每个人一个personid

-- Show the messageid and personid of the messages with multiple people
    SELECT
    messageid,
    personid
FROM
    recipients
WHERE
    messageid IN (
        SELECT
            messageid
        FROM
            (
                SELECT
                    messageid,
                    personid,
                    COUNT(DISTINCT personid) AS num_people_in_message
                FROM
                    recipients
                GROUP BY
                    messageid
                HAVING
                    num_people_in_message > 1
            ) AS messages_with_multiple_people
    )
GROUP BY
    messageid, personid

我是否正确理解了您的问题并提供了您需要的答案?但愿如此。非常感谢sqlfiddle帮助我确保这些查询实际上对您有用。

于 2012-12-01T20:00:18.190 回答
-1

I don't think you can use select and update in one query for MySQL my advice would be to use procedures to achieve the same

于 2012-12-01T19:33:47.737 回答