From: | Dirk Griffioen <dirk(at)code-shop(dot)com> |
---|---|
To: | pgsql-sql(at)postgresql(dot)org |
Subject: | join and sort on 'best match' |
Date: | 2006-12-13 09:26:41 |
Message-ID: | 457FC751.6080104@code-shop.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
Hi Everybody,
I have been breaking my head on the following problem: how to join 2
tables and sort the results on the best match.
explanation:
- there are 3 tables, items, tags and items_tags. The items_tags table
links items to tags.
- I have one item which has certain tags, and I want to look up all the
other items that have those tags as well
- results should be sorted and presented by 'best match': first all the
items that have 3 tags in common, then 2 and last 1
example:
Item 1 : news, nature, greenpeace
Item 2 : news, nature
Item 3 : news, nature, greenpeace, whale
Item 1 and Item 3 are the best match.
So far, the SQL I came up wiht looks like:
SELECT id, COUNT(items_tags.item_id) AS quantity
FROM items JOIN items_tags ON items_tags.item_id = items.id
WHERE id in (select item_id from items_tags where tag_id in (select
tag_id from items_tags where item_id=?))
GROUP BY items_tags.item_id,id
ORDER BY quantity DESC
note: the '?' in the query represents the dynamic part: I have 1 item
and I want to look up matching items.
To me, this query means the following:
- get all items that have tags, the 'JOIN', and count the tags, but only
those that match on the same tags, the 'WHERE'
- then show them
I thought I had found the solution (my test cases worked), but I now
find cases that should be found by the query but are not.
Can anyone please help me?
Dirk
From | Date | Subject | |
---|---|---|---|
Next Message | Ragnar | 2006-12-13 10:29:47 | Re: join and sort on 'best match' |
Previous Message | Cronje Fourie | 2006-12-13 05:53:32 | Re: TPCH Benchmark query result invalid |