我是MySQL的初学者,我遇到了一些问题。我有两张桌子。其中一个名为core
,有200.000个条目,包含messageid
列。另一个表称为recipients
,有1.200.000个条目,其列为recipientid
,messageid
和personid
。
我正在表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时,查询成功运行,但不显示任何内容。这是否意味着存在问题?
答案 0 :(得分:0)
...您需要能够在core
上执行查询,而无需超时或崩溃服务器。根据您更新的问题,您可能需要在core
上创建一些索引以帮助加快对它的查询(否则数据库必须扫描 整个表 以确保它正在做正确的事情)。至少,messageid
上的索引应该有所帮助:
ALTER TABLE core ADD INDEX messageid_idx(messageid);
messageid上的这个索引应该有助于加快对该列进行操作的任何查询,例如更新查询。
我的其余部分将分为两部分。首先,问题的答案,您确定要忽略personid
中messageid
的{{1}}个recipients
。
我的答案的第二部分包含我将提前执行的其他查询,以分析多个personid
以确定它们是否真正重要。也许你真的确定每personid
messageid
多个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
进行更新:
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
个重复:
{{1}}
我是否正确理解了您的问题并提供了您需要的答案?希望如此。非常感谢sqlfiddle帮助我确保这些查询真正适合您。
答案 1 :(得分:-1)
我认为你不能在MySQL的一个查询中使用select和update 我的建议是使用程序来实现相同的