我是MySQL的初学者,遇到了一些问题。我有两张桌子。其中之一称为core
,具有200.000条目并包含列messageid
。另一个表称为recipients
,具有1.200.000条目,并且具有列recipientid
,messageid
和personid
。
我在表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/