2009-11-18 3 views
2

Je ne suis pas sûr de savoir comment faire cela en SQL. Ici, il est en pseudocode:Foreach dans SQL?

  1. Prenez la liste des noeuds avec le type de contenu X.
  2. Pour chaque nœud, prendre la valeur de Y. champ
  3. Insérer dans term_nodes VALUES ((tid qui correspond à Y) 4, (nID du noeud X))

Le (tid qui correspond à Y) est donnée par

SELECT `tid` FROM `term_data` WHERE `name` = Y 

(I j'essaie d'assigner la taxonomie dans Drupal 6).

Comment est-ce que je peux faire ceci?

Répondre

5

Vous ne voulez pas vraiment faire quelque chose comme un foreach. Ne pensez pas à SQL comme procédural, comme la plupart du code (où vous faites une chose, puis une seconde, et ainsi de suite). Vous devez penser à cela en fonction de l'ensemble, où avez-vous quelque chose à de grands morceaux qui répondent à certaines exigences. Quelque chose comme:

INSERT INTO term_nodes (tid, x, nid) -- these are the field names 
<subquery that selects all the data> 

Le sous-requête doit simplement sélectionner toutes les données que vous souhaitez insérer, peut-être quelque chose comme:

SELECT nodeId, 4, termId FROM nodes WHERE contentType = X 

donc mettre tous ensemble, vous obtenez:

INSERT INTO term_nodes (tid, x, nid) 
SELECT nodeId, 4, termId FROM nodes WHERE contentType = X 

Pas besoin d'essayer de parcourir chaque élément de la sous-requête et de les insérer un à la fois, faites-le tout en même temps.

Voici un bon article que j'ai trouvé sur Procedural versus Set-Based SQL qui peut vous aider à mieux comprendre le concept.

2

Si vous pouvez utiliser SQL standard, ne pouvez-vous pas utiliser une instruction INSERT/SELECT?

INSERT INTO term_nodes(fld, fld2, fld3) 
    SELECT tid, nodeid, 4 FROM term_data WHERE ... ? 
+0

Oui, mais comment faire pour chaque nœud d'un ensemble? –

2
INSERT INTO `term_nodes` (fld1, fld2, fld3) 
     SELECT tn.`tid`, 4, n.`nid` 
     FROM `nodes` n 
     INNER JOIN `term_nodes` tn ON tn.`name`=n.`Y` 
     WHERE n.`ContentType`= X