[MySQL]Meervoudige insert, 1 variabele blijft gelijk

Pagina: 1
Acties:

  • jlrensen
  • Registratie: Oktober 2000
  • Laatst online: 06-05 19:45

jlrensen

plaatjes vullen geen gaatjes

Topicstarter
Ik post regelmatig nieuwsberichtjes op een website, en nu zijn we bezig om een soort dossiers te maken, waar we meerdere artikelen in kunnen bundelen. Aangezien een artikel ook in meerdere dossiers kan zitten, hebben we een aparte tabel gemaakt waarin de koppeling tussen dossiers en artikelen wordt vastgelegd (n:m, dus).
Bij het aanmaken van een nieuw dossier wil ik een lijst van artikelen meegeven, die in dat dossier komen. er zijn dus twee variabelen:

$dossierid: bv: 1 en
$artikelid: bv: 2, 3, 4

Nu wil ik een query maken, om in de koppeltabel, artikeldossiers, hiermee te vullen. Opzich is dit een werkende query:

INSERT INTO artikeldossiers (artikelid, dossierid)
VALUES (2, 1), (3, 1), (4, 1)

Maar aangezien het dossierid maar 1 maal voorkomt, moet ik deze query dan eerst met een for-next loop in elkaar zetten. Dat kan wel, maar ik vind het weinig elegant. Ik vroeg me af of er ook een manier is om met behulp van alleen die variabelen de query te maken, iets als

INSERT INTO artikeldossiers (artikelid, dossierid)
VALUES ((2, 3, 4), 1)

maar helaas werkt dit niet. Weet iemand of zoiets wel mogelijk is met MySQL?

Men moet het denken bijbrengen, niet wat al gedacht is. ~C. Gurlitt


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

MySQL biedt voor zover ik weet geen alternatieve syntax die mogelijk maakt wat jij wil. Je zult dus in je applicatie zelf (met PHP zo te zien) de query moeten gaan opbouwen. Dat eerste, werkende, voorbeeld is trouwens niet eens zoveel lastiger te fabriceren dan het tweede, niet werkende, dat je post. :) Ik denk in ieder geval dat je toch een beetje aan die methode vastzit. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

't Kan niet in SQL en ook niet in speciale MySQL-extenties. Je kan wel waarden weglaten en later met een update veranderen, maar dat is tamelijk zinloos om te doen en over het algemeen complexer.

Aangezien je die 2e query ook zou moeten genereren is het weinig zinvol moeilijk te proberen doen om een voor het oog mooiere query te krijgen. Ik raad je ten sterkste aan gewoon je eerste query te genereren. 't Is eleganter imho om gewoon de standaardfunctionaliteit van SQL te gebruiken, dan moeilijk te doen om een randgeval "nog eleganter" te krijgen :)

  • jlrensen
  • Registratie: Oktober 2000
  • Laatst online: 06-05 19:45

jlrensen

plaatjes vullen geen gaatjes

Topicstarter
die tweede is makkelijk te genereren,

PHP:
1
2
3
4
5
6
<?php
$dossierid = '1';
$artikelid = '2, 3, 4';
$q = 'insert into artikeldossiers (fileid, articleid)
 VALUES ((' . $artikelid . '), ' . $dossierid . ')';
?>


de eerste iets moeilijker

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$dossierid = '1';
$artikelid = '2, 3, 4';
$artikelen = explode(",", $artikelid);

$q = 'insert into artikeldossiers (fileid, articleid) ';

for ($i=0; $i<count($artikelen); $i++)
{
  $q = $q . '(' . $dossierid . ', ' . trim($artikelen[$i]) . '), ';
}
$q = substr($q, 0, strlen($q)-2);
?>


Maar het is verder best te doen, ik hoopt alleen dat ik een mogelijkheid van MySQL over het hoofd had gezien, niet dus.

In ieder geval bedankt voor de antwoorden :)

[ Voor 13% gewijzigd door jlrensen op 13-06-2005 23:51 ]

Men moet het denken bijbrengen, niet wat al gedacht is. ~C. Gurlitt


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

jlrensen schreef op maandag 13 juni 2005 @ 23:48:
die tweede is makkelijk te genereren,
Ook alleen maar als je het toevallig in die vorm krijgt ;)
Als je het zo als user-input krijgt ben je sowieso nogal gevaarlijk bezig om het rechtstreeks in een query te mikken.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

PHP:
1
$q = substr($q, 0, strlen($q)-2);

Kan sowieso korter:
PHP:
1
$q = substr($q, 0, -2);

maar persoonlijk vind ik een dergelijke constructie eleganter:
PHP:
1
2
3
4
5
6
7
$v = array();
for ($i=0; $i<count($artikelen); $i++)
{
  $v[] = '(' . $dossierid . ', ' . trim($artikelen[$i]) . ')';
}

$q .= implode(', ', $v);

Intentionally left blank


  • Onno
  • Registratie: Juni 1999
  • Niet online
ACM schreef op maandag 13 juni 2005 @ 22:51:
't Kan niet in SQL en ook niet in speciale MySQL-extenties.
Nee?
SQL:
1
insert into artikeldossiers select id,1 from artikels where id in (2,3,4)
Pagina: 1