Gebruik van VIEWS in SQL voor datafeeds
Vaak gebruik je voor pagina’s over producten een kleine subset van de producten die een merchant aanbiedt. In onderstaand voorbeeld bouw ik zogenaamd een website over schoenen. Ik wil graag een gedeelte van de site vullen met aanbiedingen van schoenen en daarin onderscheid kunnen maken tussen verschillende types (bv. alleen dames slippers laten zien).
Voor deze tutorial moet je een phpMyAdmin hebben die views ondersteund. Ik heb zelf versie 2.11.9.4 gebruikt. Daarnaast dient de MySQL versie in elk geval 5.0.1 te zijn.
Ik begin met een viertal adverteerders uit te zoeken: Omoda, Shoemixx, Van den Assem en Trendshoes.
Dan download ik de datafeeds naar mijn computer, allemaal met ” en ; als scheidingstekens.

Download datafeeds
In mijn splinternieuwe database maak ik tabellen aan voor alle vier de adverteerders met commando’s als:
CREATE TABLE shoemixx ( url VARCHAR(500), title VARCHAR(500), description VARCHAR(500), offerid VARCHAR(500), image VARCHAR(500), price float, category VARCHAR(500), subcategory VARCHAR(500), stock VARCHAR(500), timetoship VARCHAR(500), ean VARCHAR(500), price_shipping VARCHAR(500), price_old float, vendor VARCHAR(500), category_path VARCHAR(500), largeimage VARCHAR(500), thirdcategory VARCHAR(500), column0 VARCHAR(500), column1 VARCHAR(500), column2 VARCHAR(500), color VARCHAR(500) ) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Als je deze tool gebruikt om van een datafeed header een SQL commando te maken, dan kom je al een eind in de richting.
Vervolgens importeer ik alle vier de datafeeds met de IMPORT functie in phpMyAdmin (CSV using LOAD DATA, Replace table data with file) – gewoon ouderwets met de hand.
Voor je het weet heb je vier verschillende tabellen van vier adverteerders met allemaal producten. Nu gaat het mij om de producten die in de uitverkoop zijn. Ik begin bij Omoda. Als ik even in die tabel kijk, dan zie ik dat alle ‘Sale’ producten de string “SALE: ” aan het begin hebben. Dat vind ik niet zo mooi dus:
UPDATE `omoda` set `title` = REPLACE(`title`, 'SALE: ','');
Vervolgens wil ik alles selecteren wat volgens mij ‘Sale’ is, oftewel er is een oude prijs die hoger is dan de huidige prijs.
SELECT * FROM omoda WHERE `price` < `price_old`;
Dat is de selectie die ik wil gebruiken voor mijn Sales tabel. Ik sla deze resultaten op als een View door onderaan in phpMyAdmin op de link “CREATE VIEW” te klikken. Ik sla de view op als omoda_sales. Dit geeft me in feite een nieuwe tabel waarmee ik kan werken. Vervolgens doe ik hetzelfde nog een paar keer door het commando in 1 keer in te geven:
CREATE VIEW `trendshoes_sale` AS SELECT * FROM `trendshoes` WHERE `price` < `price_old`
Nu kan ik het eerder geleerde UNION statement gebruiken om tabellen te maken voor bijvoorbeeld dames en heren. Deze vier adverteerders gebruiken verschillende termen voor dames: damesschoenen, Damesschoenen, dames, dus dat wordt een LIKE ‘%dames%’.
SELECT url, title, description, price, price_old from omoda_sale where `category` LIKE '%dames%' UNION SELECT url, title, description, price, price_old from shoemixx_sale where `category` LIKE '%dames%' UNION SELECT url, title, description, price, price_old from trendshoes_sale where `category` LIKE '%dames%' UNION SELECT url, title, description, price, price_old from assem_sale where `category` LIKE '%dames%'
De resultaten set die daar uit komt sla ik weer op met het CREATE VIEW knopje (of als je heel stoer doet plak je dat commando hierboven erbij) en ik sla hem op als dames_sales.

Nu heb ik een mooie tabel met alle damesschoenen die in de aanbieding zijn van vier adverteerders, zonder dat ik in php een hoop werk heb gedaan om de boel in 1 tabel te zetten en ik hoef nu geen complexe queries te maken als ik bijvoorbeeld alle slippers wil hebben:
SELECT * FROM `dames_sales` WHERE `title` LIKE '%slipper%'
Enkele punten om op te letten:
- Aanpassingen in een view kunnen ook effect hebben op de bovenliggende tabel
- Aanpassingen in een bovenliggende tabel kunnen effect hebben op een view
- Dit voorbeeld is erg simpel in de zin dat ik niet netjes categorieën van adverteerders gebruik, dus je kan niet uitgaan van dat WHERE `title` LIKE ‘%slipper%’ ale slippers oplevert
- Let op je MySQL en phpMyAdmin versie
- Doordat ik handmatig importeer is het relatief veel werk de database up to date te houden


9 november, 2009 at 22:36
Wat is er gebeurt met normalisering, hoe kan je zo een fout voorbeeld geven door voor elke adverteerder een apparte tabel te maken?!
Zet alles gewoon in 1 tabel en groepeer vervolgens op shop_id (of iets dergelijks) 1 tabel waar je oneindig veel in kan stoppen.
Moet je bedenken een query over 10 adverteerders?!
Tevens als ik nu een slipper wil selecteren… die geen slipper in de titel heeft?! krijg ik dus niet de juiste resultaten.