Tabellen koppelen en samenvoegen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Carmelo Mormina

Carmelo Mormina

26/04/2012 10:15:16
Quote Anchor link
Hallo,

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
 
PHP hulp

PHP hulp

23/12/2024 03:09:42
 
Q S

Q S

26/04/2012 11:03:17
Quote Anchor link
Waarom zijn er losse tabellen voor products_description en products_to_categories?
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.
 
Carmelo Mormina

Carmelo Mormina

26/04/2012 11:05:50
Quote Anchor link
Hallo QS,

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.
 
Erik Rijk

Erik Rijk

26/04/2012 11:14:12
Quote Anchor link
SELECT *
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?
 
Q S

Q S

26/04/2012 11:17:18
Quote Anchor link
wellicht dat dit wel kan, maar ben nog niet helemaal zeker

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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";
Gewijzigd op 26/04/2012 11:21:53 door Q S
 
Carmelo Mormina

Carmelo Mormina

26/04/2012 11:33:23
Quote Anchor link
Hey QS,

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
 
Q S

Q S

26/04/2012 11:35:33
Quote Anchor link
Bekijk mijn reactie nog eens, ik was dat inderdaad vergeten en heb hem aangepast
 
Carmelo Mormina

Carmelo Mormina

26/04/2012 11:39:03
Quote Anchor link
Hallo Erik,

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 !!!
 
Erwin H

Erwin H

26/04/2012 12:27:01
Quote Anchor link
Carmelo, even een opmerking. JOINS kan je op meerdere manieren maken. Een INNER JOIN geeft je alleen die records terug die een waarde hebben in beide tabellen. Dus als jij de tabel products_description via een INNER JOIN koppelt aan de tabel products, dan krijg je alleen iets te zien voor die producten die ook daadwerkelijk een record hebben in de tabel products_description.

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.
 
Q S

Q S

26/04/2012 12:37:13
Quote Anchor link
@Erwin, goede toevoeging daar had ik idd. niet aan gedacht.
 
Carmelo Mormina

Carmelo Mormina

26/04/2012 13:06:15
Quote Anchor link
Hallo Erwin,

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!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.