第 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帮助我确保这些查询实际上对您有用。