webForumDet fria alternativet

Flera inserts? LAST_INSERT_ID()?

1 svar · 350 visningar · startad av crisse6

crisse6Medlem sedan dec. 20002 441 inlägg
#1

Hej,

Har en array som kan se ut så här (php):

$arr = ['Nisse', 'Kalle'];

Har två tabeller: tbl_tags, tbl_tagmap

tbl_tags ser ut så här:
id - int, auto_increement
copy - varchar

tbl_tagmap ser ut så här:
id - int, auto_increement
tagId - int
photoId - int

Hur gör jag en fin sql som gör så att en insert sker till "tbl_tags" för varje värde i arrayen och sedan tar varje "id" och gör en insert i tbl_tagmap?

Snabbaste, coolaste, mest effektiva frågas efter :)

Tack!

nitro2k01Medlem sedan aug. 20037 630 inlägg
#2
// Fråga 1: Lägg till data från arrayen
$sql = 'INSERT INTO tbl_tags (copy) VALUES ';
$comma = ''; // Inget komma innan första raden

// Bygg frågan
foreach($arr as $item){
  $escaped = mysql_real_escape_string($item);
  $sql .= "$comma ('$escaped')";
  $comma = ',';
}
$sql .= ';';

// Utför fråga 1
mysql_query($sql) or die('Fel vid insättning av arraydata');

// Plocka ut info om det inlagda datat
$firstid = mysql_insert_id(); // id för den första inlagda raden 
$lastid = $firstinsertedid + mysql_affected_rows(); // id för den sista inlagda raden + 1 (Så använd < nite <= nedan)

// Bygg frågan
$sql = '
  INSERT INTO tbl_tagmap (tagid, photoid)
  SELECT t.id AS tagid, 0 AS photoid 
  FROM tbl_tags t 
  WHERE id >= $firstid AND ID < $lastid;
';

// Utför fråga 2
mysql_query($sql) or die('Kunde inte lägga in data i tbl_tagmap');

Fråga 1 bör vara ganska självförklarande. Fråga 2 går ut på att du plockar ut samma data från tbl_tags som du just lade in, och lägger in i tbl_tagmap.
photoid har du inte sagt vad du vill ha i, så jag lade värdet 0 där. (SELECT ... 0 AS photoid ...)

PHP-koden är otestad, men utgår från följande SQL. (Jag har inte tillgång att testa PHP där jag är nu, utan bara SQL genom phpmyadmin.) anledningen att jag skrev om den som PHP är att mysql_query inte kan hantera flera queries i samma mysql_query. Använder du mysqli-interfacet bör du kunna använda mysqli_multi_query med följande fråga rakt av. (Indatat måste så kalrt formateras)

INSERT INTO `tbl_tags` (copy)
VALUES 
('pelle'), 
('johan'),
('johnny')

;

INSERT INTO `tbl_tagmap` (tagid, photoid)
SELECT t.id AS tagid, 0 AS photoid FROM `tbl_tags` t WHERE id >= LAST_INSERT_ID() AND ID < LAST_INSERT_ID() + ROW_COUNT();
Genererad på 378 ms · cache AV · v20260730165559-full.f96bc7eb