パート 0 - 他のことをする前に...
core
...タイムアウトしたり、サーバーをクラッシュさせたりすることなく、クエリを実行できる必要があります。更新された質問に基づいて、おそらくクエリを高速化するためにいくつかのインデックスを作成する必要があります(そうしないと、データベースはテーブル全体core
をスキャンして、正しいことを確認する必要があります)。最低限、以下のインデックスが役立ちます。
messageid
ALTER TABLE core ADD INDEX messageid_idx(messageid);
messageid のこのインデックスは、更新クエリなど、その列で動作するすべてのクエリを高速化するのに役立ちます。
私の答えの残りは2つの部分に分かれます。最初に、あなたの質問へのpersonid
答えmessageid
ですrecipients
。
personid
私の回答の 2 番目の部分には、複数の を分析してそれらが本当に重要かどうかを確認するために事前に実行する追加のクエリが含まれています。personid
おそらく、倍数permessageid
は大したことではないと本当に確信していますが、うまくいけば、これはあなたと同様の質問に対する答えを探している他の人に利益をもたらすでしょう.
パート 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
個々の ごとに 1 つずつ、重複する があることに注意して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に感謝します。