1

私はMySQLの初心者ですが、少し問題があります。2つのテーブルがあります。それらの1つが呼び出されcore、200.000エントリがあり、列が含まれていますmessageid。別のテーブルはと呼ばれrecipients、1.200.000のエントリがあり、列とがrecipientidありmessageidますpersonid

両方の列のが同じであるエントリをインポートするためpersonidに、テーブルに新しい列を作成しています。テーブルにはいくつかのエントリが複数あることを知っているので、最初のエントリを返したいだけです。私は次のSQLクエリを使用しています:corepersonidmessageidrecipientsmessageid

UPDATE core A
SET personid =
(SELECT personid
FROM recipients B
WHERE B.messageid = A.messageid)

理由はわかりませんが、うまくいきません。他のテーブルからデータをインポートしたいときに動作しますが、このテーブルでは動作しません。最終的には、ローカルのphp/mysqlサーバーがクラッシュするだけです。

それを行う方法について何か考えがありますか?

アップデート:

これは、SHOWINDEXFROM受信者の結果です。列名「recipientid」のカーディナリティは1356207で、インデックスタイプはBTREEです。列名「messageid」のカーディナリティは「NULL」で、インデックスタイプはBTREEです。

SHOW INDEX FROMコアを実行すると、クエリは正常に実行されますが、何も表示されません。問題があるということですか?

4

2 に答える 2

0

パート 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に感謝します。

于 2012-12-01T20:00:18.190 に答える
-1

MySQL の 1 つのクエリで select と update を使用できるとは思いません。手順を使用して同じことを達成することをお勧めします。

于 2012-12-01T19:33:47.737 に答える