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

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

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


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

您对此有任何想法吗?

更新:

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

当我运行SHOW INDEX FROM core时,查询成功运行,但是什么也不显示。这是否意味着有问题?

最佳答案

第0部分-在您执行其他操作之前...

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


ALTER TABLE core ADD INDEX messageid_idx(messageid);


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

我剩下的答案将分为两个部分。首先,是您问题的答案,确定要忽略personid中每个messageid的多个recipients

我的答案的第二部分包含其他查询,我将在这些查询中预先执行以分析多个personid以确定它们是否真正重要。也许您确实确定每个personid的多个messageid没什么大不了的,但是希望这会对寻求与您类似问题的答案的其他人有所帮助。

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

对于每个personid具有多个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帮助我确保这些查询确实对您有用。

关于mysql - MySQL:从另一个表中获取数据而没有重复项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13662726/

10-09 03:59