2016-09-21 3 views
0

Voici ce que je voudrais faire pour:MySQL Wildcard match Substring pour deux champs

J'ai une base de données MYSQL qui a plusieurs champs - les champs auxquels je fais allusion sont contact_email et site_url dans une table appelée url_links

Ce que je recherche est une simple requête de 'mise à jour' qui va définir un drapeau binaire s'il y a une correspondance.

en pseudo-code:

Mise à jour url_links SET domainMatch = 1 où {sous-chaîne de contact_email après @} = {sous-chaîne de site_url - pourraient être http: // https: // https://www ou tout url - dire juste le nom de domaine}

donc si le courrier électronique est quelque chose comme [email protected] et le domaine est http://www.mywebsiteisgreat.com il ne correspondra pas à

mais si l'e-mail est [email protected], il définirait le champ domainMatch sur 1 - les domaines correspondent.

Merci!

+0

merci Martin pour améliorer ma question. Alors que nous sommes sur le sujet - quelle est la meilleure pratique ici pour expliquer pourquoi une solution fonctionne. J'essaie toujours de comprendre ce que vous pouvez faire avec MySQL. Je pourrais faire ces mêmes choses en PHP avec des boucles mais c'est tellement plus cool de le faire directement dans MYSQL. Nous en apprendrons davantage si nous lisons aussi des références à des fonctions et des liens vers ceux-ci pour aider les lecteurs à comprendre pourquoi les choses sont telles qu'elles sont. Merci encore. – Viktor

Répondre

1

Essayez cette requête:

UPDATE url_links 
SET domainMatch = 1 
WHERE SUBSTRING_INDEX(contact_email,'@', -1) 
LIKE CONCAT('%', SUBSTRING_INDEX(site_url,'.', -2), '%'); 

(je mis à jour ce avec les noms de champs réels de la base de données afin que nous puissions le tester plus facile)

+0

Cela n'a pas fonctionné, il n'a pas trouvé les bons emails dans la base de données. C'est parce que la base de données contient surtout des URL avec 'http: //' et 'https: //' - elle n'a trouvé que ceux qui étaient mauvais, c'est à dire manquant le http: // donc un script mis à jour devrait enlever le http:// https: // et http: // www. et https: // www ou toute autre combinaison peut-être http: // m. Peut-être le moyen de le faire serait de simplement rechercher une sous-chaîne sur le champ URL qui est APRÈS le PREMIER POINT (.) Qui couvrirait la plupart des URL – Viktor

+1

J'ai travaillé là-dessus un peu maintenant. Voyez si SUBSTRING_INDEX() fait l'affaire –

+0

Merci de l'avoir fait - cela n'a pas fait grand-chose - c'est toujours 'trouver' les enregistrements qui manquent http: // - c'est-à-dire les erreurs dans la base de données. :) Je penche vers peut-être faire 2 requêtes - a) une requête pour extraire le nom de domaine dans son propre champ appelons-le 'domaine' et b) votre requête qui fonctionne très bien tant que le nom de domaine lui-même est isolé. Qu'est-ce que tu penses? Est-il même possible de faire avec 1 requête? – Viktor