login  Naam:   Wachtwoord: 
Registreer je!
 Forum

JOIN met UNION (Opgelost)

Offline GroundZero - 26/05/2015 10:14 (laatste wijziging 26/05/2015 12:01)
Avatar van GroundZeroLid 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:

  1. $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,
  2. p.id, p.ProductType,p.ProductNumber, p.newcollection , p.ItemName, p.ItemNameSub, p.BrandID,
  3. p.nQtyAvailable,p.AvailableFromSupplier,p.nQtyAvailable_shop,p.nQtyAvailable_breda,
  4. p.SpecialOfferMIT,p.SpecialOfferPrice, p.InternetPrice,p.HighVAT, p.show_mm ,p.Diameter, p.BandSize,
  5. sum(relevance)
  6. FROM Products AS p
  7. INNER JOIN products_domains AS pd
  8. ON
  9. p.id = pd.product_id
  10. LEFT JOIN NewCollection nc
  11. on nc.id = p.newcollection
  12. LEFT JOIN brandpage_product_sort bps
  13. on bps.pid = p.id
  14. WHERE
  15. pd.domain_id = "'.mysql_real_escape_string($g_iDomainID).'"') or die(mysql_error());


De code die werkt maar slechts 1 resultaat terug geeft:

  1. $sql = 'SELECT *, sum(relevance)
  2. FROM (
  3.  
  4. SELECT p.*, 100 AS relevance
  5. FROM Products AS p
  6. INNER JOIN products_domains AS pd
  7. ON p.id = pd.product_id
  8. LEFT JOIN NewCollection nc
  9. ON nc.id = p.newcollection
  10. LEFT JOIN brandpage_product_sort bps
  11. ON bps.pid = p.id
  12. WHERE p.ItemName LIKE "%a%"
  13. AND pd.domain_id = "'.mysql_real_escape_string($g_iDomainID).'"
  14.  
  15. UNION SELECT p.*, 75 AS relevance
  16. FROM Products AS p
  17. INNER JOIN products_domains AS pd
  18. ON p.id = pd.product_id
  19. LEFT JOIN NewCollection nc
  20. ON nc.id = p.newcollection
  21. LEFT JOIN brandpage_product_sort bps
  22. ON bps.pid = p.id
  23. WHERE p.MetaKeywords LIKE "%a%"
  24. AND pd.domain_id = "'.mysql_real_escape_string($g_iDomainID).'"
  25.  
  26. ) AS p
  27. 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!

3 antwoorden

Gesponsorde links
Offline Thomas - 26/05/2015 19:41
Avatar van Thomas Moderator Als je met FULLTEXT indexes/searches werkt, kun je ook scores / weegfactoren gebruiken.

Daarnaast, als je nieuwe queries aan het schrijven bent zou je kunnen (en eigenlijk moeten) overwegen om van MySQLi of PDO gebruik te gaan maken, want de MySQL-extensie is al 10 jaar (ver)oud(erd) en wordt op korte termijn voorgoed uitgefaseerd.

> (enigszins gedateerde) PDO tutorial
> MySQLi tutorial
Bedankt door: GroundZero
Offline GroundZero - 27/05/2015 16:58
Avatar van GroundZero Lid Bah, goed om te weten. Veel verschil tussen MySQLi en -of PDO vergeleken met MYSQL?
Offline Thomas - 27/05/2015 21:27
Avatar van Thomas Moderator PDO is compleet anders in vergelijking met MySQL.

Als je van MySQL naar MySQLi gaat kun je zaken in beginsel in principe redelijk 1:1 converteren als je de procedurele variant van MySQLi gebruikt, maar dit is misschien ook een goed moment om je queries eens te onderwerpen aan een security audit.

Dit alles staat ook beschreven in de voorgenoemde tutorial. Deze is best uitgebreid. Lees ook aandachtig de paragraaf over addslashes en magic_quotes.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.228s