SQL vraagje mbt tot documenten en tags

Status
Niet open voor verdere reacties.

krikri

Gebruiker
Lid geworden
15 okt 2008
Berichten
6
Dag iedereen,

Ik heb een database dbdocumenten waarmee ik documenten wil archiveren. In die tabel tbldocumenten gebruik ik gewoon een id, extensie van het document, datum van invoer.

Omdat ik daarnaast ook gebruik wil maken van een paar tags per document, heb ik nog een 2de tabel met document id en de naam van de tag.

Als ik nu de 2 tabellen join met elkaar krijg ik de volgende gegevens:
mysql> select d.*, t.* from tbldocumenten d, tbltags t where d.id=t.id;
+----+-------+---------------------+----+---------------+
| id | type | datum | id | naam |
+----+-------+---------------------+----+---------------+
| 2 | .tbl | 2013-01-10 14:03:25 | 2 | 137 |
| 2 | .tbl | 2013-01-10 14:03:25 | 2 | elektrabel |
| 2 | .tbl | 2013-01-10 14:03:25 | 2 | januari |
| 3 | .tbl | 2013-01-10 14:03:43 | 3 | 169 |
| 3 | .tbl | 2013-01-10 14:03:43 | 3 | elektrabel |
| 3 | .tbl | 2013-01-10 14:03:43 | 3 | februari |
| 4 | .tbl | 2013-01-10 14:08:20 | 4 | 137 |
| 4 | .tbl | 2013-01-10 14:08:20 | 4 | Elektrabel |
| 4 | .tbl | 2013-01-10 14:08:20 | 4 | november |
| 5 | .tbl | 2013-01-10 14:08:44 | 5 | 168 |
| 5 | .tbl | 2013-01-10 14:08:44 | 5 | december |
| 5 | .tbl | 2013-01-10 14:08:44 | 5 | Elektrabel |
| 6 | .xlsx | 2013-01-10 16:05:12 | 6 | geboortelijst |
+----+-------+---------------------+----+---------------+
13 rows in set (0.00 sec)

Nu wil ik bv gaan zoeken achter alle documenten van Elektrabel in de maand januari en uiteraard binnen hetzelfde id.

Iemand die weet hoe ik dit het beste aan boord leg?

Vriendelijke groeten en bedankt op voorhand voor de hulp,
Kristof
 
Dag Kristof,

Wat bedoel je precies met 'gaan zoeken achter...', wat wil je precies als output krijgen?
Als ik het goed begrijp wil je het volgende:

SELECT doc.*, tag.* FROM tbldocumenten doc
INNER JOIN tbltags tag WHERE doc.id = tag.id
WHERE tag.naam = 'Elektrabel' OR tag.naam = 'januari'


Vriendelijke groet,

Bart
 
Dag Kristof,

Wat bedoel je precies met 'gaan zoeken achter...', wat wil je precies als output krijgen?
Als ik het goed begrijp wil je het volgende:

SELECT doc.*, tag.* FROM tbldocumenten doc
INNER JOIN tbltags tag WHERE doc.id = tag.id
WHERE tag.naam = 'Elektrabel' OR tag.naam = 'januari'


Vriendelijke groet,

Bart

Dag Bart,

Met 'gaan zoeken achter' bedoel ik dat ik in vb.net via een textbox enkele kernwoorden intik, bv Elektrabel, januari. Vervolgens wil ik dan via SQL alle documenten weergeven waarvan de tags/kernwoorden bestaan uit Elektrabel EN januari binnen hetzelfde document.

Als we met onderstaande gegevens zouden werken dan zou ik als resultaat willen:
doc id type datum
2 .tbl 2013-01-10 14:03:25

Als ik zou zoeken op Elektrabel wil ik de volgende resultaten:

2 ...
3 ...
4 ...
5 ...

Laat gerust iets weten mocht het nog onduidelijk zijn.

mysql> select d.*, t.naam from tbldocumenten d inner join tbltags t where d.id=
.id;
+----+-------+---------------------+---------------+
| id | type | datum | naam |
+----+-------+---------------------+---------------+
| 2 | .tbl | 2013-01-10 14:03:25 | 137 |
| 2 | .tbl | 2013-01-10 14:03:25 | elektrabel |
| 2 | .tbl | 2013-01-10 14:03:25 | januari |
| 3 | .tbl | 2013-01-10 14:03:43 | 169 |
| 3 | .tbl | 2013-01-10 14:03:43 | elektrabel |
| 3 | .tbl | 2013-01-10 14:03:43 | februari |
| 4 | .tbl | 2013-01-10 14:08:20 | 137 |
| 4 | .tbl | 2013-01-10 14:08:20 | Elektrabel |
| 4 | .tbl | 2013-01-10 14:08:20 | november |
| 5 | .tbl | 2013-01-10 14:08:44 | 168 |
| 5 | .tbl | 2013-01-10 14:08:44 | december |
| 5 | .tbl | 2013-01-10 14:08:44 | Elektrabel |
| 6 | .xlsx | 2013-01-10 16:05:12 | geboortelijst |
+----+-------+---------------------+---------------+
13 rows in set (0.00 sec)

Grt,
Kristof
 
Voor een enkel feature kun je like gebruiken

[sql]
SELECT d.*, t.naam FROM tbldocumenten d INNER JOIN tbltags t WHERE d.id=.id AND t.naam LIKE elektrabel;
[/sql]

Wil je 2 tags gebruiken ben je volgens mij gebonden aan een subquery tenzij je alleen de ID's terug wil hebben. Qua performance weet ik niet wat sneller is een join met een subquery of een "select" statement met "CASE". Maar voor beperkt gebruik zal dat waarschijnlijk niet veel uitmaken.
 
Voor een enkel feature kun je like gebruiken

[sql]
SELECT d.*, t.naam FROM tbldocumenten d INNER JOIN tbltags t WHERE d.id=.id AND t.naam LIKE elektrabel;
[/sql]

Wil je 2 tags gebruiken ben je volgens mij gebonden aan een subquery tenzij je alleen de ID's terug wil hebben. Qua performance weet ik niet wat sneller is een join met een subquery of een "select" statement met "CASE". Maar voor beperkt gebruik zal dat waarschijnlijk niet veel uitmaken.

Eerst en vooral bedankt aan iedereen voor de snelle reactie, ondertussen de juiste query kunnen opbouwen en deze ziet er als volgt uit:
mysql> select d.id, d.type, d.datum from tbldocumenten as d inner join tbltags a
s t on d.id=t.id and t.naam like 'elektrabel' inner join tbltags as t2 on d.id=t
2.id and t2.naam like 'januari';

We kunnen terug een stapje verder :thumb:

Grt,
Kristof
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan