Archief - tags, mysql & verwante records vinden

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Deadangel

Legacy Member
Dus, ik heb een mysql database ( naam ), en ik moet de 3 verwante records zien, iemand 'n idee hoe ik dit fix ?

Ik zal even een voorbeeld geven;

Naam
- naam_id
- titel
- tag1
- tag2

Titel + tags
AC/DC -> Muziek & rock
Pink Floyd -> Muziek & rock
Festival -> Muziek
Pc -> elektronica & internet
plant -> natuur
mp3 -> bestand & muziek

Dus als ik op de tags van "pink floyd" zoek, moet ik het volgende resultaat krijgen:
1. AC/DC ( 100% )
2. Festival ( 50 % )
3. mp3 ( 50 % )

Iemand een idee hoe ik dit fix ?

GivenToFly

Legacy Member
Uw database-ontwerp is niet juist en dat maakt het heel moelijk om een juiste query op te stellen en zorgt ervoor dat je model nagenoeg onaanpasbaar is. Bv: wat als een item ineens 3 tags nodig heeft? Ga je dan een extra kolom toevoegen? Door je tabellen te normaliseren (lees bv. Database ontwerp 101 - Yapf) kan je systeem geoptimaliseerd worden en kunnen gemakkelijk queries zoals wat jij wil worden uitgevoerd en is het perfect mogelijk dat één item geen tags heeft terwijl een ander er 100 heeft.

Je hebt dan 3 tabellen nodig:
Naam:
naam_id
titel
bv. (1, 'AC/DC')

Tags:
id
naam
bv. (1, 'muziek')

Naam_has_tag:
id
naamid
tagid
bv. (1, 1, 1) => geeft aan dat 'AC/DC' getagd is met 'muziek'

Je query kan er dan bv. als volgt uitzien (is een mogelijkheid, kan waarscijnlijk nog wel een beetje beter door die IN() te vervangen door joins en in de veronderstelling dat 'Pink Floyd' id 2 heeft).
Code:
SELECT
	COUNT(naam_has_tag.id) as nummatches,
	naam.titel as titel
FROM
	naam,
	naam_has_tag
WHERE
	naam_has_tag.naamid <> 2 AND
	naam.id = naam_has_tag.naamid AND
	naam_has_tag.tagid IN(
		SELECT
			reftags.tagid
		FROM
			naam_has_tag as reftags
		WHERE
			reftags.naamid = 2)
GROUP BY
	naam_has_tag.naamid
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan