Tabellen koppelen en samenvoegen
Ik probeer via een aantal tutorials een dynamische RSS feed te maken.
Hiervoor heb ik bepaalde gegevens nodig uit de database.
Deze staan echter in meerdere tabellen en krijg het maar niet voor elkaar deze op de juiste manier op te vragen en samen te voegen.
De tabellen met bijbehorend benodigde kolommen zijn:
products
|_ products_id
|_ products_image
|_ products_price
|_ products_date_added
products_description
|_ products_id
|_ products_name
|_ products_description
products_to_categories
|_ products_id
|_ categories_id
categories_description
|_ categories_id
|_ categories_name
Wat ik graag wil is het volgende;
Stap - 1 - Haal alle producten uit de tabel "products" waarbij de kolom "products_status" de waarde "1" heeft.
Stap - 2 - Voeg hier aan toe de waarden uit de tabellen "products_description" en "products_to_categories" waarbij de resultaten "products_id" overeenkomen met de opgehaalde product_id's in Stap - 1.
Stap - 3 - Voeg hier aan toe de waarden uit de "categories_name" van de tabel "categories_description", waarbij de waarde "categories_id" uit de tabel "categories_to_description" overeen komen met de waarde "categories_id" uit de tabel "products_to_categories".
Het resultaat welke ik hiermee probeer te krijgen zou dan moeten bestaan uit:
1 - Product ID
2 - Product plaatje
3 - Product prijs
4 - Product datum
5 - Product status
6 - Product naam
7 - Product omschrijving
8 - Categorie ID
9 - Categorie naam
Ik heb al vele dingen geprobeerd via voorbeelden van JOIN, INNER JOIN, WHERE, UNION, etc., maar mijn kennis van MySQL en php is helaas onvoldoende om hier een juiste query voor te maken.
Alle hulp is van harte welkom
Zodat je meerdere omschrijvingen aan een produkt kunt hangen en een produkt in meerdere categorien kunt plaatsen?
Als dit niet nodig is, heb je nog de mogelijk om dit samen te voegen? Dat zou het allemaal namelijk een stuk makkelijker maken.
Bedankt voor je reactie.
Inderdaad, maar het betreft hier een bestaande database van een webshop (oscommerce 2.3.1) en een aanpassing van de database ten gunste hiervan is dus niet mogelijk.
FROM `products`
INNER JOIN `products_description` ON `products_description`.`products_id` = `products`.`products_id`
INNER JOIN `products_to_categories` ON `products_to_categories`.`products_id` = `products`.`products_id`
WHERE `products`.`products_status` = '1'
Een deel van je query..
Je data moet uiteindelijk zo gegroepeerd worden dat wanneer een product in 2 categorieën valt, je dus 2 rijen voor dat product krijgt.. Als dit is gelukt kan je met een nieuwe join de categorie eigenschappen ophalen ( categories_description ). Je kan ook wel CONCAT_WS gebruiken om de categorie id's terug te krijgen in 1 cel, maar dan zal je dit in php moeten uitlezen en een nieuwe query uit moeten voeren om de description e.d. adh van het id op te halen..
Duidelijk verhaal?
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$sql = "SELECT p1.products_id, p1.products_image, p1.products_price, p1.products_date_added, p2.products_name, p2.products_description, p3.categories_id, p4.categories_name
FROM products as p1
INNER JOIN products_description as p2 ON p1.products_id = p2.products_id
INNER JOIN products_to_categories as p3 ON p1.products_id = p3.products_id
INNER JOIN categories_description as p4 ON p3.categories_id = p4.categories_id
WHERE p1.products_status = 1";
FROM products as p1
INNER JOIN products_description as p2 ON p1.products_id = p2.products_id
INNER JOIN products_to_categories as p3 ON p1.products_id = p3.products_id
INNER JOIN categories_description as p4 ON p3.categories_id = p4.categories_id
WHERE p1.products_status = 1";
Gewijzigd op 26/04/2012 11:21:53 door Q S
Je wordt heel erg bedankt :-)
Heb het zohuist getest en het geeft precies alle data die ik nodig heb.
Hij haalt nu echter nog wel alle producten op ipv. alleen de producten met productstatus 1.
Kan ik dit oplossen door zoiets als; WHERE products.products_status = "1" ?
Zo ja, waar plaats ik deze dan in de query
Bekijk mijn reactie nog eens, ik was dat inderdaad vergeten en heb hem aangepast
De query van QS biedt my reeds de oplossing maar wil je zéér bedanken voor de genomen moeite. Verder heb ik voor de oplossing van QS gekozen daar deze alleen de data ophaalt van de kolommen die ik nodig heb.
De tabellen bevatten namelijk meer kolommen met data die niet van toepassing is.
(SELECT tabel.kolomnaam vs SELECT *)
Je verhaal was echter duidelijk.
Nogmaals bedankt !
Toevoeging op 26/04/2012 11:45:13:
Hij gaf eerst een fout maar dat kwam door 1"; ipv "1"; in de regel.
Super bedankt QS !!!
Misschien is dat precies wat je wilt, dat kan ik niet beoordelen, maar als je ook de producten wilt zien die geen description hebben, dan zou je een LEFT JOIN moeten gebruiken (verder blijft de hele query die Q S gaf gelijk). Een LEFT JOIN pakt alle records uit de products tabel en plakt daar of het record uit products_description tegenaan, of geeft allemaal NULL waardes als er geen record is.
Dit is puur een opmerking om je bewust te laten zijn van het verschil tussen INNER JOIN en LEFT JOIN. Als je dat niet weet zou je later wel eens resultaten kunnen krijgen die je niet verwacht.
@Erwin, goede toevoeging daar had ik idd. niet aan gedacht.
Duidelijke uitleg, bedankt hiervoor !
De tabel products_description heeft bij ons ALTIJD een waarde en dus zou een INNER JOIN in dit geval voor mij geen problemen moeten opleveren.
Maar voor verdere toepassingen kan ik me heel goed voorstellen dat dit een probleem kan zijn.
Dit zal ik dan ook zeker in mijn achterhoofd houden.
Nogmaals bedankt voor je toelichting!