尝试使用来自其他两个表的数据更新一个mySQL表失败

时间:2011-10-24 20:04:47

标签: php mysql sql

我正在尝试更新一个保存员工输入数据的表。该表有三列:entry id,field id和value。我想确保根据每个条目在该表中的每个字段都有一行。因此我编写了以下php / sql脚本。思考过程是获取两个数组(一个包含条目ID,另一个包含字段ID)并检查输入表以查看每个字段和条目是否存在现有行。如果没有,则使用inert into命令添加值为0的行,但此命令失败。我的猜测是由于此功能的强度导致的超时错误。有什么建议吗?

$db = JFactory::getDBO();

$field_query = 'SELECT id FROM `jos_directory_field`';
$db->setQuery( $field_query );
$fields = $db->loadObjectList();

$entry_query = 'SELECT id FROM `jos_directory_entry`';
$db->setQuery( $entry_query );
$entries = $db->loadObjectList();

  for($e=0;$e count($entries);$e++) {
    for($i=0;$i count($fields);$i++) {
      $insert_query = 'INSERT INTO `jos_directory_enf` (entry_id,field_id,field_value)';
      $insert_query .= 'SELECT '.$entries[$e]->id.','.$fields[$i]->id.',0';
      $insert_query .= 'FROM dual WHERE NOT EXISTS (SELECT * FROM `jos_directory_enf`';
      $insert_query .= 'WHERE entry_id = '.$entries[$e]->id.' and field_id = '.$fields[$i]->id.')';
      $db->setQuery( $insert_query );
      $db->query();
    }
  }

1 个答案:

答案 0 :(得分:0)

这太糟糕了Joomla似乎不支持预备语句,因为它们可以帮助重复查询的性能。

然而,在这种情况下,有一个更好的选择。您应该能够使用单个SQL语句替换PHP代码,并使用INSERT语句的IGNORE子句。首先,确保entry_idfield_idjos_directory_enf上有unique index。那么SQL语句就像:

INSERT IGNORE INTO `jos_directory_enf` (entry_id,field_id,field_value)
  SELECT e.id, f.id, 0
  FROM jos_directory_entries AS e
    JOIN jos_directory_field AS f
;