2016-09-19 21 views
0

私が作業しているのは、データベース用の電子メールクリーンアップスクリプトです。そうすることで、私たちは無効で、壊れている、またはもはや周囲のドメインのリストを特定しました。私たちは、ドメイン名、すなわち@記号の後のすべてを特定することによってこれを行います。MYSQL更新サブトークンが別のテーブルに存在する場合インナー結合

update url_links 
set link_bad=1, 
    emailCarrier='bad-domain.com' 
where contact_email like '%@bad-domain.com'; 

は、プロバイダを識別し、フィールドを設定します。問題は何百ものドメインが有効でないことです(上記は単なる例です)。

私がしたいのは、 'emailCarriers'と呼ばれる別のテーブルへの '内部結合'です。私はこれをPHPでループとして書くことができましたが、誰かがMySQLでこれを行う巧妙な方法を持っていたかどうかここでコミュニティに尋ねたかったのです。

emailCarriersテーブルにはすべての悪いドメインキャリアが含まれているため、クエリはemailCarriersテーブルを参照し、ドメイン名部分の部分文字列(@記号の後ろ)に一致するものを探し出し、更新して、「bad-domain.com」にemailCarriersテーブルの対応するドメインを入力します。

ありがとうございます!

+1

'update'は' join'sすることができます。 –

+0

はい私はupdateがjoinを許していることを知っていますが、他のテーブルemailCarriersへの結合の構文を理解することはまだ初心者です。そのテーブルには「プロバイダ」というフィールドがあります。プロバイダーとの一致がテーブルのレコードと同じキャリアである限り、 – Viktor

答えて

1
update url_links ul 
join emailCarriers ec on ul.contact_email like concat('%@', ec.domain) 
set ul.link_bad=1, 
    ul.emailCarrier=ec.domain; 
+0

ご返信ありがとうございます。 ul.emailCarrier = 'bad-domain.com'は実際には他のテーブルからドメインを取得する必要があります - それは私の挑戦です - あなたのスクリプトはすべての結果をbad-domain.comに設定します - email.ru 'か、フィールドに格納されている100の異なる悪いドメインのいずれかを使用してください。一致する結果を特定するにはどうすればよいですか?ですから、もしあなたが略語を使って更新をたどった場合、私が正しく理解するならば、それを省略形で参照することができます。 – Viktor

+0

@Viktor 'ul'は' url_links'のエイリアスです。 'emailCarrier'を同じドメインに設定したい場合は' ul.emailCarrier = ec.domain'を実行してください。 – shmosel

+0

@Viktorはい、私は自分の答えを更新しました。 – shmosel

0

あなたはこのような何かを試すことができます: -

UPDATE url_links u JOIN emailCarrier e 
ON u.SUBSTRING_INDEX(url_links, '@', 1) = b.provider 
SET link_bad = 1 
+0

ありがとうございますAnkit - 上記の例のように、部分文字列を取得してemailCarrier変数フィールドにどのように割り当てるのですか? 2つのSETがあります.1つはlink_badで、もう1つは通信事業者自身です。キャリアフィールドは部分文字列の結果です。 – Viktor

関連する問題