Mysql update
Ik heb een vaag.
Ik heb twee tabellen de een met de namen van de producten en de andere met de categorie id's.
Wat ik graag wil is dat alle producten die met de letter a beginnen naar een nieuwe categorie gaan.
Dus dan moet het categorie id in de tabel products_to_categories geupdate worden.
Dus hij moet kijken in de tabel met producten kijken welke producten met de letter a beginnen en die selecteren.
Daarna moet hij die update uitvoeren in de tabel met de products_to_categories.
Het eenige wat over een komt in die twee tabelen zijn de product_id.
Zie hier onder wat ik geprobeerd hebt maar niet werkt.
Ook hier onder de tabel struktuur.
Ik hoop dat iemand mijn kan helpen.
Code (php)
1
UPDATE products_to_categories AS ptc, products_description AS pd SET ptc.categories_id = 36 WHERE LOWER(pd.products_name) LIKE '%a%'
Code (php)
1
2
3
4
5
2
3
4
5
CREATE TABLE `products_to_categories` (
`products_id` int(11) NOT NULL,
`categories_id` int(11) NOT NULL,
PRIMARY KEY (`products_id`,`categories_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
`products_id` int(11) NOT NULL,
`categories_id` int(11) NOT NULL,
PRIMARY KEY (`products_id`,`categories_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
CREATE TABLE `products_description` (
`products_id` int(11) NOT NULL AUTO_INCREMENT,
`language_id` int(11) NOT NULL DEFAULT '1',
`products_name` varchar(64) COLLATE latin1_general_ci NOT NULL DEFAULT '',
`products_description` text COLLATE latin1_general_ci,
`products_url` varchar(255) COLLATE latin1_general_ci DEFAULT NULL,
`products_viewed` int(5) DEFAULT '0',
PRIMARY KEY (`products_id`,`language_id`),
KEY `products_name` (`products_name`)
) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
`products_id` int(11) NOT NULL AUTO_INCREMENT,
`language_id` int(11) NOT NULL DEFAULT '1',
`products_name` varchar(64) COLLATE latin1_general_ci NOT NULL DEFAULT '',
`products_description` text COLLATE latin1_general_ci,
`products_url` varchar(255) COLLATE latin1_general_ci DEFAULT NULL,
`products_viewed` int(5) DEFAULT '0',
PRIMARY KEY (`products_id`,`language_id`),
KEY `products_name` (`products_name`)
) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
WHERE ptc.products_id = (
SELECT ptc.products_id
FROM products_description
WHERE LOWER(pd.products_name) LIKE '%a%')
Het kan zijn dat deze constructie niet mag en je een mutating table error krijgt. Vreemd datamodel overigens tenzij er voor je products_description meerdere categorieen van toepassing kunnen zijn. Klopt dat?
Gewijzigd op 26/01/2012 10:25:31 door Aad B
Ik krijg geen error maar hij zet nu alle prodcten in de tabel products_to_categories op 36
Het datamodel is inderdaad een beetje raar het is van oscommerce en producten kunnen inderdaad in meerdere categorie zitten.
Wat het probleem is waarom ik dit wil ik heb gister 5000 producten toeevoerd van uit exel dat is allemaal goed gegaan.
Nu wil ik ze alleen sorteren aangezien het om cd's gaat wil ik categorie aan maken van a tot z maar als je weet dat a al 400 cd's bevat wil je dat niet handmatig sorteren.
Overgens heb ik net ook nog iets anders geprobeerd maar dat wil ook niet.
UPDATE
products_to_categories
INNER JOIN
products_description ON products_description.products_id = products_to_categories.products_id AND LOWER(products_description.products_name) LIKE '%a%'
SET
categories_id = 35
WHERE ptc.products_id = (
SELECT ptc.products_id
FROM products_description
WHERE LOWER(pd.products_name) LIKE '%a%'
AND ptc.products_id=pd.products_id)
Ik hoop dat je de totale update wel terug hebt kunnen draaien?
En het is gelukt ik heb zelf nog een klein stukje verder gerommeld.
Dit is hem geworden.
Bedankt voor je hulp!
UPDATE
products_to_categories
INNER JOIN
products_description ON products_description.products_id = products_to_categories.products_id AND LOWER(products_description.products_name) LIKE 'b%' AND
products_to_categories.categories_id!=33 AND
products_to_categories.categories_id!=1 AND
products_to_categories.categories_id!=27 AND
products_to_categories.categories_id!=17 AND
products_to_categories.categories_id!=2 AND
products_to_categories.categories_id!=22 AND
products_to_categories.categories_id!=23 AND
products_to_categories.categories_id!=21 AND
products_to_categories.categories_id!=24 AND
products_to_categories.categories_id!=25 AND
products_to_categories.categories_id!=28 AND
products_to_categories.categories_id!=29 AND
products_to_categories.categories_id!=30 AND
products_to_categories.categories_id!=31
SET
categories_id = 39