2010-11-07 14 views
3

Tableau T1:MySQL: Boucle une table et en met une autre à jour?

s (string)  | x (int) 
----------------+-------- 
"gfrdgeradfg" | 0 
"abdfodpnmn" | 0 
...    | ... 

Tableau t2:

c (varchar(1)) 
----- 
"a" 
"c" 
"g" 
"r" 
----- 

Je voudrais ajouter +1 à t1.x pour chaque t2.c de caractère qui se produit dans t1.s, à savoir le résultat devrait quelque chose comme ceci:

s    | x 
----------------+-------- 
"gfrdgeradfg" | 3  (contains "a","g","r") 
"abdfodpnmn" | 1  (contains "a") 
...    | ... 

Looping par t2 et mise à jour t1 en php est assez simple, mais je préfère le faire dans SQL pur, si possible.

Merci pour votre aide.

Répondre

4
UPDATE t1 
SET x = (
    SELECT SUM(t1.s LIKE CONCAT('%', t2.c, '%')) 
    FROM t2 
) 

Précision: L'expression t1.s LIKE CONCAT('%', t2.c, '%') évaluera à une valeur booléenne qui équivaut à 1 ou 0 dans MySQL.

Je ne l'ai pas testé alors s'il vous plaît dites-moi si cela ne fonctionne pas.

+0

Le vôtre ne fonctionnait pas,? à cause de la parenthèse devrait être avant de sélectionner - cela semble crunch nombre ok ... (- toujours en attente de résultat, 60k lignes ...). MISE A JOUR t1 SET x = (SELECT SUM (t1.s COMME CONCAT ('%', t2.c, '%')) DE t2 ) – ajo

+0

J'espère que ça fonctionne bien, et il semble très soigné. Bien que cela prenne beaucoup de temps (t1 a 60k lignes, t2 2k). - Si t1 était une table très longue, mais que t2 n'avait que très peu (disons 3) d'entrées, y aurait-il un moyen plus rapide d'atteindre ce résultat en passant principalement par les entrées t2? – ajo

+0

Oui, cela a très bien fonctionné (cela a pris environ 10 minutes). Merci beaucoup. (Je soupçonne qu'il n'y aurait pas une solution beaucoup plus rapide ...) – ajo