Foreach в SQL? - PullRequest
       22

Foreach в SQL?

2 голосов
/ 18 ноября 2009

Я не совсем уверен, как это сделать в 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).

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

Ответы [ 3 ]

5 голосов
/ 19 ноября 2009

Вы действительно не хотите делать что-то вроде 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 , которая может помочь вам немного лучше понять концепцию.

2 голосов
/ 19 ноября 2009
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
2 голосов
/ 19 ноября 2009

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

INSERT INTO term_nodes(fld, fld2, fld3)
  SELECT tid, nodeid, 4 FROM term_data WHERE ... ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...