Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP]Relevantie zoekresultaten - hulp bij denkwijze

Pagina: 1
Acties:

  • MisterEagle
  • Registratie: Juli 2010
  • Nu online
Hallo,

Laat ik voorop stellen dat ik al enige tijd niets meer met PHP/MySQL heb gedaan, maar dat ik niet zo zeer opzoek ben naar hulp qua code. Wel zou ik een andere denkwijze horen voor een uitdaging waar ik tegenaan loop.

Ik hoop de situatie zo het duidelijkste uit te kunnen leggen.
In de database zitten 2 tabellen.
Ideeën
idee_id
idee_gebieden
idee_naam

en
gebieden
gebied_id
gebied_naam

een idee kan betrekking hebben op meerdere gebieden, zodoende dacht ik het veld "idee_gebieden" te vullen met "gebied_id; gebied_id" etc.

Het enige zoekfilter bestaat uit checkboxen met "gebied_naam" erachter. Dit is dus dynamisch. Iedere nieuw toegevoegd gebied komt er automatisch bij.
Het is niet de bedoeling dat er een limiet komt op de hoeveelheid checkboxen welke je aan kan vinken.

Nu dacht ik zelf om dan het volgende te doen:
1) na het submitten van het filter tel hoeveel vinkjes er zijn gezet en creëer net zoveel variabelen (1 t/m aantal vinkjes)
2) haal de hele "ideeen" tabel op
3) ga per record na hoeveel deze matched en plaats deze is de juiste variabele van hoeveel het idee matched (1 t/m aantal vinkjes)
4) display vervolgens de aangemaakte variabele waarbij het hoogste gedaan eerst.

Nu is dit vast niet de mooiste aanpak (en dat hoeft ook niet persé) maar mijn uitdaging zit hem nu in het feit dat ik het niet voor elkaar krijg om een variabel aantal variabelen aan te maken.

Tevens zit ik hier al even over na te denken en ik kan me geen andere manier bedenken hoe dit aan te pakken is.

Ik hoop dat iemand me een beetje in de goede richting kan sturen of de gouden tip heeft!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Keyword hier is n:m (ook wel many-to-many, veel-op-veel) relaties ;)

[ Voor 59% gewijzigd door RobIII op 02-04-2014 17:47 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Ten eerste: het is gewoon verkeerd om meerdere ID's op die manier in 1 kolom op te gaan slaan. De database kan niet indexen op een dergelijke string en je kunt geen foreign-key relaties aanleggen.

Als je gewoon een koppeltabel (idee_gebied) met een idee_id en gebied_id gebruikt, kun je hier gewoon op filteren.

Dus: in je filterlijst haal je gewoon een lijst met gebieden op. Dan laat je iemand X gebieden aanvinken. Stel iemand heeft gebied_id 1,5 en 200 aangevinkt. Dan is je query iets in de trant van:

SELECT i.idee_id, i.idee_titel FROM idee i INNER JOIN idee_gebied ig ON ig.idee_id = i.idee_id WHERE ig.gebied_id IN (1,5,200)

Klaar. Zo ga je om met N:M relaties, je gaat never nooit niet meerdere IDs in 1 kolom proppen.

FF nog iets kwa naamgeving: het is over het algemeen bad practice om de naam van de tabel in de kolomnamen te herhalen. Het is overbodig aangezien ID in tabel "idee" al het id van een idee record hoort te zijn. Voor een kolom met een foreign-key relatie gebruik je meestal <tabel>_id

Stel je gebruikt een meervoudsvorm voor jouw tabellen dan ziet het er ff zo uit (in het engels, van Nederlandse tabelnamen krijg ik jeuk ;)):

ideas:
- id
- title
- ...

areas:
- id
- title
- ...

ideas_areas:
- id
- idea_id
- area_id

[ Voor 66% gewijzigd door Hydra op 02-04-2014 17:50 ]

https://niels.nu


  • MisterEagle
  • Registratie: Juli 2010
  • Nu online
Beide bedankt voor jullie reacties! hier kan ik weer mee verder!

  • MisterEagle
  • Registratie: Juli 2010
  • Nu online
sorry voor de bump maar ik loop hier toch nog een stukje in vast namelijk op het volgende

inmiddels weet ik hoeveel vinkjes de gebruiker heeft gezet en ik kan alle ideeën weergeven die raking hebben met een gebied.
Echter, het gebied hoeft slechts 1 van de ideeën te raken om weergegeven te worden, maar hoe kan ik nu dan de relevantie bepalen? Kan dit in de query al, of moet ik dit erna doen door het aantal keer dat een idee naar voren komt te vergelijken met het aantal vinkjes wat is gezet?
(als in aantal vinkjes = 100%, hoeveel vinkjes matched het en dan berekenen)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je wil de data aggregeren, dan kun je gebruik maken van GROUP BY en een aggregate functie zoals COUNT, en eventueel achteraf sorteren met ORDER BY

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • MisterEagle
  • Registratie: Juli 2010
  • Nu online
En dat kan in een enkele query?
Dan krijg ik dus iets van

SELECT i.idee_id, i.idee_titel, COUNT(ig.idee_id) AS relevantie FROM idee i INNER JOIN idee_gebied ig ON ig.idee_id = i.idee_id WHERE ig.gebied_id IN (1,5,200) GROUP BY ig.idee_id ORDER BY relevantie DESC

SELECT i.idee_id, i.idee_titel, COUNT(ig.idee_id) AS relevantie FROM idee i INNER JOIN idee_gebied ig ON ig.idee_id = i.idee_id WHERE ig.gebied_id IN (1,5,200) GROUP BY ig.idee_id ORDER BY COUNT(ig.idee_id) DESC

Vanavond even proberen op de db, maar in een testomgeving op w3s lijkt dit wel te werken.

thanks!

[ Voor 32% gewijzigd door MisterEagle op 15-04-2014 15:44 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1