Archief - Table naar table transfer

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

demon326

Legacy Member
Hallo Allen, enige tijd geleden heb ik onze drupal 5 website naar versie 6 gebracht, hierdoor kon ik onze review module niet meer gebruiken en dus waren de "scores" van onze reviews verloren, althans dat dacht ik tot enkele uurtjes geleden. Ik heb namelijk een oude backup gevonden met de scores nog in, maar nu zou ik deze graag automatisch in de nieuwe tabel willen zetten, anders moet ik 2*205 tabellen handmatig aanpassen, dus ik hoop dat iemand me hier een query kan geven die me kan helpen..

Tabellen+info:
Bron tabel:
Code:
CREATE TABLE `review` (
  `nid` int(10) NOT NULL default '0',
  `review_rate` mediumint(9) default NULL,
  PRIMARY KEY  (`nid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

(87, 100),

Het eerste getal stelt de "node ID" voor, het tweede getal is de score. Nu zou ik deze in de volgende tabel moeten krijgen:

Code:
UPDATE `drupal1`.`content_type_review` SET `field_score_rating` = '90' WHERE `content_type_review`.`vid` =1420 LIMIT 1 ;

Dus hier is het laatste getal de "ID", ik zou enkel het eerste getal van de bovenstaande score(field_score_rating) in de tabel field_score_rating krijgen zodat deze terug up to date zijn..

Dus de inhoud van review_rate moet in field_score_rating komen, de id's horen dan gelijk te zijn.. maar ik heb persoonlijk geen idee hoe dat te doen :unsure:

TiZon

Legacy Member
geef eens de 'create' statement van beide tabellen.

Je moet een update met een join doen, maar zo geraak ik er niet aan uit :)

EDIT: ah, nee, kan met een subqry, dat is makkelijker :p

EDIT2: Tadaa, maar maak toch eerst maar een backup.

UPDATE 'content_type_review' SET field_score_rating = (SELECT review_rate FROM review WHERE review.nid = content_type_review.vid

Denk ik toch ;)

dJeez

Legacy Member
Sowieso eerst een backup nemen uiteraard.

Om eventuele nieuwe review scores te behouden en de oude over te nemen voer je volgende query uit :
Code:
replace into content_type_review(vid, field_score_rating) select nid, review_rate from review

De andere optie is een update zoals TiZon aanhaalt, maar dan wel met een cross-table query, want zijn query zal zeker niet werken (al de scores zullen op de score van het laatste record staan). De volgende zou in principe moeten werken :
Code:
update content_type_review ctr inner join review r set ctr.field_score_rating=r.review_rate where ctr.vid=r.nid

Voorwaarde voor die laatste query is wel dat voor elke node id er reeds een record in de content_type_review tabel bestaat uiteraard, mij lijkt het beter van clean te starten en de eerste query te gebruiken...

TiZon

Legacy Member
Waarom zou mijn subselect juist niet werken? ben niet helemaal mee... Jouw inner join doet toch hetzelfde?

Cycloon

Legacy Member
TiZon zei:
Waarom zou mijn subselect juist niet werken? ben niet helemaal mee... Jouw inner join doet toch hetzelfde?

Je subquery gaat 1 maal de waarde ophalen waarna alle elementen van de huidige tabel zullen geupdate worden met die waarde vermits daar nergens een extra voorwaarde is :)

demon326

Legacy Member
dJeez zei:
Sowieso eerst een backup nemen uiteraard.

Om eventuele nieuwe review scores te behouden en de oude over te nemen voer je volgende query uit :
Code:
replace into content_type_review(vid, field_score_rating) select nid, review_rate from review

De andere optie is een update zoals TiZon aanhaalt, maar dan wel met een cross-table query, want zijn query zal zeker niet werken (al de scores zullen op de score van het laatste record staan). De volgende zou in principe moeten werken :
Code:
update content_type_review ctr inner join review r set ctr.field_score_rating=r.review_rate where ctr.vid=r.nid

Voorwaarde voor die laatste query is wel dat voor elke node id er reeds een record in de content_type_review tabel bestaat uiteraard, mij lijkt het beter van clean te starten en de eerste query te gebruiken...

De id's bestaan idd al in beide tabellen :applause:, dus zal eens de query's testen :)

//edit: de query werkte perfect :).. bedankt iedereen!

dJeez

Legacy Member
Cycloon zei:
Je subquery gaat 1 maal de waarde ophalen waarna alle elementen van de huidige tabel zullen geupdate worden met die waarde vermits daar nergens een extra voorwaarde is :)
Die uitleg klopt inderdaad, 'k had het zelf niet beter kunnen verwoorden :p.

TiZon

Legacy Member
Hm, blijkbaar werkt mijn qry toch wel, net even wat tests gedaan.

1) TBL 'test' aanmaken + opvullen
Code:
CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `score` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO `bdevos`.`test` (`id`, `score`) VALUES (NULL, '7'), (NULL, '8'), (NULL, '5'), (NULL, '3'), (NULL, '4');

2) TBL 'nogeentest' aanmaken + opvullen
Code:
CREATE TABLE IF NOT EXISTS `nogeentest` (
  `ID` int(11) NOT NULL,
  `hierinkomen` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=lati


INSERT INTO `bdevos`.`nogeentest` (`ID`, `hierinkomen`) VALUES ('1', '0'), ('2', '0'), ('3', '0'), ('4', '0'), ('5', '0');

3) Update met Subselect uitvoeren:
Code:
UPDATE 'nogeentest' SET 'hierinkomen' = (SELECT score FROM test WHERE nogeentest.ID = test.ID)

4) Resultaat van export
Code:
CREATE TABLE IF NOT EXISTS `nogeentest` (
  `ID` int(11) NOT NULL,
  `hierinkomen` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Gegevens worden uitgevoerd voor tabel `nogeentest`
--

INSERT INTO `nogeentest` (`ID`, `hierinkomen`) VALUES
(1, 7),
(2, 8),
(3, 5),
(4, 3),
(5, 4);

dus juist hé :D

dJeez

Legacy Member
Yups, ik had blijkbaar gewoon te snel naar je query gekeken en 't was nog vroeg :p.

demon326

Legacy Member
Om te beginnen wil ik mij even excuseren voor een drie jaar oude topic bump, maar het heeft geen zin om een aparte topic te starten voor een gelijkaardig probleem.:unsure:

Ik wil nu dus de inhoud van van tabel field_score_rating naar field_score_review_value (default value is null )brengen, beide tabellen zitten in de hoofdtabel, content_type_review.

Op deze manier kunnen rating accurater worden ingegeven, wat het de reviewers makkelijker maakt :applause:

dJeez

Legacy Member
Een tabel in een tabel? That does not compute. Bedoel je niet gewoon een veld in een tabel? Post anders de structuur van je tabel(len) eens.

demon326

Legacy Member
dJeez zei:
Een tabel in een tabel? That does not compute. Bedoel je niet gewoon een veld in een tabel? Post anders de structuur van je tabel(len) eens.

Ik had het idd verkeerd geschreven, ik bedoelde dus een column :p.

Ik heb een screenshot gemaakt die de bedoeling toont:
http://www.plaatjesdump.nl/upload/458ff7a806d77bd4ef9f3fd91e3a6d87.jpg

De tabel field_score_rating moet blijven bestaan, deze verwijder ik later via de drupal interface. De fivestar module kan maar per 10 raten, daarom wil ik naar handmatige ingave overgaan :)

dJeez

Legacy Member
Maar da's toch poepsimpel?

Gewoon
Code:
update content_type_review set field_score_review_value = field_score_rating;

demon326

Legacy Member
dJeez zei:
Maar da's toch poepsimpel?

Gewoon
Code:
update content_type_review set field_score_review_value = field_score_rating;

Ik ken niets van mysq, en google maakte het niet bepaald duidelijk :sad:
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan