MySQL:从另一个表中获取数据而不重复

时间:2012-12-01 19:06:15

标签: mysql sql

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

我正在表personid中创建一个新列core,以便导入两列中personid相同的messageid个条目。我知道在表recipients中,有几个messageid的条目,所以我只想返回第一个。{1}}。我使用以下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时,查询成功运行,但不显示任何内容。这是否意味着存在问题?

2 个答案:

答案 0 :(得分:0)

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

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

ALTER TABLE core ADD INDEX messageid_idx(messageid);

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

我的其余部分将分为两部分。首先,问题的答案,您确定要忽略personidmessageid的{​​{1}}个recipients

我的答案的第二部分包含我将提前执行​​的其他查询,以分析多个personid以确定它们是否真正重要。也许你真的确定每personid messageid多个personid并不是什么大不了的事,但希望这会让其他人找到类似于你的问题的答案。

第1部分:任何人都会做,谢谢

对于每个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 进行更新:

messageid

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

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

如果您只是想知道哪个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 个重复:

{{1}}

我是否正确理解了您的问题并提供了您需要的答案?希望如此。非常感谢sqlfiddle帮助我确保这些查询真正适合您。

答案 1 :(得分:-1)

我认为你不能在MySQL的一个查询中使用select和update 我的建议是使用程序来实现相同的