Lid |
|
Beste,
wij hebben een zoekoptie op onze webwinkel waar een paar honderdduizend producten in staan. De query is dus wel zwaar maar dat ter zijde. We hebben een werkende zoekopdracht momenteel. Om het simpel te houden zal ik hier de verkorte code laten zien. Wat ik nu graag wil is een score toekennen zodat we kunnen zeggen welke dingen zwaarder wegen dan andere, echter krijg ik het niet voor elkaar.
Het is gelukt, echter krijg ik dan maar één resultaat terug wat niet klopt. Wanneer ik de union verwijder dan krijg ik gewoon alle resultaten zoals het hoort weer terug.
Iemand die mij kan vertellen hoe ik dit werkend krijg?
De code zoals we die nu hebben (groot stuk er uit gelaten maar deze werkt en geeft exact het idee weer:
$query = mysql_query('SELECT p.ProductNumber, p.assign_breda, p.lock_breda, ((p.nQtyAvailable + p.AvailableFromSupplier + nQtyAvailable_breda + p.nQtyAvailable_shop)> 0) as inVoorraad, pd.product_id,
p.id, p.ProductType,p.ProductNumber, p.newcollection , p.ItemName, p.ItemNameSub, p.BrandID,
p.nQtyAvailable,p.AvailableFromSupplier,p.nQtyAvailable_shop,p.nQtyAvailable_breda,
p.SpecialOfferMIT,p.SpecialOfferPrice, p.InternetPrice,p.HighVAT, p.show_mm ,p.Diameter, p.BandSize,
sum(relevance)
FROM Products AS p
INNER JOIN products_domains AS pd
ON
p.id = pd.product_id
LEFT JOIN NewCollection nc
on nc.id = p.newcollection
LEFT JOIN brandpage_product_sort bps
on bps.pid = p.id
WHERE
pd.domain_id = "'.mysql_real_escape_string($g_iDomainID).'"') or die(mysql_error());
$query = mysql_query('SELECT p.ProductNumber, p.assign_breda, p.lock_breda, ((p.nQtyAvailable + p.AvailableFromSupplier + nQtyAvailable_breda + p.nQtyAvailable_shop)> 0) as inVoorraad, pd.product_id, p.id, p.ProductType,p.ProductNumber, p.newcollection , p.ItemName, p.ItemNameSub, p.BrandID, p.nQtyAvailable,p.AvailableFromSupplier,p.nQtyAvailable_shop,p.nQtyAvailable_breda, p.SpecialOfferMIT,p.SpecialOfferPrice, p.InternetPrice,p.HighVAT, p.show_mm ,p.Diameter, p.BandSize, sum(relevance) FROM Products AS p INNER JOIN products_domains AS pd ON p.id = pd.product_id LEFT JOIN NewCollection nc on nc.id = p.newcollection LEFT JOIN brandpage_product_sort bps on bps.pid = p.id WHERE
De code die werkt maar slechts 1 resultaat terug geeft:
$sql = 'SELECT *, sum(relevance)
FROM (
SELECT p.*, 100 AS relevance
FROM Products AS p
INNER JOIN products_domains AS pd
ON p.id = pd.product_id
LEFT JOIN NewCollection nc
ON nc.id = p.newcollection
LEFT JOIN brandpage_product_sort bps
ON bps.pid = p.id
WHERE p.ItemName LIKE "%a%"
AND pd.domain_id = "'.mysql_real_escape_string($g_iDomainID).'"
UNION SELECT p.*, 75 AS relevance
FROM Products AS p
INNER JOIN products_domains AS pd
ON p.id = pd.product_id
LEFT JOIN NewCollection nc
ON nc.id = p.newcollection
LEFT JOIN brandpage_product_sort bps
ON bps.pid = p.id
WHERE p.MetaKeywords LIKE "%a%"
AND pd.domain_id = "'.mysql_real_escape_string($g_iDomainID).'"
) AS p
ORDER BY sum(relevance) DESC';
$sql = 'SELECT *, sum(relevance) FROM ( SELECT p.*, 100 AS relevance FROM Products AS p INNER JOIN products_domains AS pd ON p.id = pd.product_id LEFT JOIN NewCollection nc ON nc.id = p.newcollection LEFT JOIN brandpage_product_sort bps ON bps.pid = p.id WHERE p.ItemName LIKE "%a%" UNION SELECT p.*, 75 AS relevance FROM Products AS p INNER JOIN products_domains AS pd ON p.id = pd.product_id LEFT JOIN NewCollection nc ON nc.id = p.newcollection LEFT JOIN brandpage_product_sort bps ON bps.pid = p.id WHERE p.MetaKeywords LIKE "%a%" ) AS p ORDER BY sum(relevance) DESC';
Wat ik graag wil is dat de volgende matches de volgende scores terug geven (bijvoorbeeld)
p.ItemName = 100 punten
p.ItemSubName = 75 punten
p.ItemTags = 50 punten
p.ItemDesc = 25 punten
alle overige 10 punten per stuk.
Ik ben al uren bezig, maar krijg het maar niet werkend helaas. Ik hoop dat iemand mij een antwoord kan geven en -of het script kan schrijven zodat ik kan zien hoe het wel moet en hiervan kan leren zodat we het in het vervolg wel begrijpen en zelf kunnen schrijven haha.
EDIT: Opgelost, de SELECT om het geheel heen dat hoefde niet, na het weglaten van deze werkte het prima!
|