第 0 部分 - 在你做任何其他事情之前......
...您需要能够在core
不超时或使服务器崩溃的情况下执行查询。根据您更新的问题,您可能必须创建一些索引core
以帮助加快对其的查询(否则数据库必须扫描整个表以确保它做正确的事情)。至少,索引messageid
应该有助于:
ALTER TABLE core ADD INDEX messageid_idx(messageid);
messageid 上的这个索引应该有助于加快对该列进行操作的任何查询,例如更新查询。
我的其余答案将分为两部分。首先,您的问题的答案,您确定要忽略 multiple personid
's per messageid
in recipients
。
我的答案的第二部分包含额外的查询,我将预先执行这些查询来分析 multiplepersonid
以确定它们是否真的重要。也许您真的确定 multiplepersonid
的 permessageid
没什么大不了的,但是希望这将有助于其他寻求与您类似的问题的答案的人。
第 1 部分:任何人都可以,谢谢
对于具有多个personid
per的收件人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帮助我确保这些查询实际上对您有用。