Ik heb een webshop voor een klant maar ik wil 3 tabellen in 1 query hebben. Ik heb nu bijvoorbeeld
winkelwagen tabel ( om je bestellingen op te halen)
producten tabel (om naam, beschrijving enzo op te halen
custom tabel ( om je foto manchetknopen bestellingen op te halen)
Nu lukt het me wel op winkelwagen tabel te koppelen aan producten maar als ik daarbij ook de derde tabel doe dan gaat dat mis.
Zoals je ziet staat er ook een GROUP by (Dat zorgt er voor dat je dezelfde producten uit je winkelwagen maar 1 keer ziet, maar het aantal wordt dan ook samengevoegd.
Ik denk dat het probleem hier aan ligt: wagen.article = producten.id OR customs.id = wagen.custom
Die wagen.article kijkt of het een product id is maar hij moet ook controleren of wagen.custom uit custom.id komt.
Query
$mijnWikelwagenQuery = $mysql->query("SELECT
wagen.id, wagen.custom, producten.soort, producten.soort_en, producten.description, producten.description_en, producten.photo, producten.name, producten.price, COUNT(wagen.id) as aantal,
(SELECT COUNT(article) FROM cart WHERE article = producten.id AND ip = '".$_SERVER['REMOTE_ADDR']."') as productAantal,
(SELECT id FROM cart WHERE article = producten.id AND ip = '".$_SERVER['REMOTE_ADDR']."' ORDER BY id DESC LIMIT 1 ) as lastid
FROM
cart wagen,
products producten,
custom customs
WHERE
wagen.ip = '".$_SERVER['REMOTE_ADDR']."' AND wagen.article = producten.id OR customs.id = wagen.custom AND wagen.deleted = 0 GROUP BY wagen.article");
Dat is een heel erg lange query. Je kan hem volgens mij stukken overzichtelijker schrijven (al wordt hij dan wel 47 regels :)
Maar je moet je ook afvragen of je dit wel allemaal in zo'n idioot grote query wil doen. Het lijkt me beter om het in verschillende stukken te knippen, maar ik ben geen SQL expert.
Ook denk ik dat je dit veel beter met JOINs kan oplossen.
Dankjewel man, ik heb het met joins gedaan. Wist niet dat het zo makkelijk was :)
[size=xsmall]Toevoeging op 31/05/2012 21:09:41:[/size]
Ah, nu werkt hij nog niet perfect.
$mijnWikelwagenQuery = $mysql->query("SELECT
products.id,
products.photo,
products.description_en,
products.soort_en,
products.description,
products.name,
products.price,
COUNT(cart.id) as aantal,
(SELECT COUNT(article) FROM cart WHERE article = products.id AND ip = '".$_SERVER['REMOTE_ADDR']."') as productAantal,
(SELECT COUNT(custom_id) FROM cart WHERE custom.id = cart.custom AND ip = '".$_SERVER['REMOTE_ADDR']."') as customAantal,
(SELECT id FROM cart WHERE article = products.id AND ip = '".$_SERVER['REMOTE_ADDR']."' ORDER BY id DESC LIMIT 1 ) as lastid
FROM
products
INNER JOIN cart
ON (cart.article = products.id)
JOIN custom
ON (custom.id = cart.custom)
GROUP BY
cart.article, cart.custom");
Inhoudelijk kan ik op dit moment niet echt een antwoord geven. Daar is deze query mij 1,2,3 iets te complex voor / geen kennis van de inhoud.
Wellicht helpt het je query stapsgewijs uit te bouwen. Je krijgt dan een beter beeld wat wel werkt en wat niet.
In dit geval start met SELECT op products
Daarna een joing op cart en daarop op custom.
Indien deze werkt zou je, als je nieuwe mysql hebt (5.2 volgens mij) gebruik kunnen maken van een view. Je maakt een nieuwe tabel op basis van je wensen en kunt daar weer op filteren.
Als je begint met de producten werk je precies verkeerd om: je loopt een lijst met producten af en kijkt of die in het winkelwagentje zitten terwijl dat al bekend is je hebt alleen de bijbehorende gegevens nog niet. Dan krijg je in eerste instantie deze query:
SELECT article AS pid
custom_id AS cid
COUNT(article) AS amount
FROM cart
GROUP BY article, custom_id
Het feit dat een aggegrate fuctie gebruikt moet worden om het aantal artikelen te bepalen betekent imo dat er iets mis is met opbouw van de tabellen.
Wat houdt het custum_id in en waarom verricht je daar een count op?
Als je begint met de producten werk je precies verkeerd om: je loopt een lijst met producten af en kijkt of die in het winkelwagentje zitten terwijl dat al bekend is je hebt alleen de bijbehorende gegevens nog niet. Dan krijg je in eerste instantie deze query:
SELECT article AS pid
custom_id AS cid
COUNT(article) AS amount
FROM cart
GROUP BY article, custom_id
Het feit dat een aggegrate fuctie gebruikt moet worden om het aantal artikelen te bepalen betekent imo dat er iets mis is met opbouw van de tabellen.
Wat houdt het custum_id in en waarom verricht je daar een count op?
Custom id is gekoppeld aan de fotomanchetknoop. Dus als je custom id hoger is dan 0 dan moet hij controleren of je idee in fotomanchetknoop tabel zit. (En als je article id op 0 staat)
[size=xsmall]Toevoeging op 03/06/2012 17:26:28:[/size]
En ik zette er een count op omdat ik wou testen of dat ging werken, maar dat werkt niet.
Wat ik met mijn eerste opmerking bedoelde is het volgende:
Stel iemand besteld 10 stuks product A, jij krijgt dan 10 records in je tabel, dat zijn er dus 9 teveel.
Maar kan je wat meer uitleg geven over wat er nu precies in het winkelwagentje terecht kan komen? Want ik heb het idee dat je teveel in 1 tabel propt.
In het winkelwagentje kunnen er normale product kopen dus standaard manchetknopen en er kunnen ook fotomanchetknopen komen.
Als die erin zitten wil ik de naam etc (gegevens) ervan ophalen. Maar ik heb bijv in me winkelwagen een veld article en die is dan gekoppeld aan een productid. Natuurlijk klopt het dan niet als je een fotomanchetknoop hebt, want die staat niet bij de producten.