Foreach в SQL?

Я не совсем уверен, как это сделать в SQL. Вот это в псевдокоде:

  1. Возьмите список узлов с типом контента X.
  2. Для каждого узла возьмите значение поля Y.
  3. Вставьте в term_nodes VALUES ((tid, соответствующий Y), 4, (nid узла X))

(tid, который соответствует Y) определяется выражением

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

(Я пытаюсь назначить таксономию в Drupal 6).

Как я могу это сделать?


person Nick Heiner    schedule 18.11.2009    source источник


Ответы (2)


Вы действительно не хотите делать что-то вроде foreach. Не думайте о SQL как о процедурном, как и о большинстве кодов (где вы делаете одно действие, затем второе и так далее). Вы должны думать об этом как о наборе, где вы что-то делаете с большими кусками, которые соответствуют определенным требованиям. Что-то типа:

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

Подзапрос должен просто выбрать все данные, которые вы хотите вставить, возможно, что-то вроде:

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

Итак, сложив все вместе, вы получите:

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

Не нужно пытаться пробежаться по каждому элементу в подзапросе и вставить их по одному, достаточно сделать это все сразу.

Вот хорошая статья, которую я нашел о Процедурный и основанный на наборах SQL, который может помочь вам немного лучше понять концепцию.

person Ryan Elkins    schedule 18.11.2009

Если вы можете использовать обычный SQL, не могли бы вы использовать оператор INSERT/SELECT?

INSERT INTO term_nodes(fld, fld2, fld3)
  SELECT tid, nodeid, 4 FROM term_data WHERE ... ?
person t3rse    schedule 18.11.2009
comment
да, но как мне сделать это для каждого узла в наборе? - person Nick Heiner; 19.11.2009