Re: Occurrence-based ranking [solved?]

2006-08-25 Thread Ben Lachman

I managed to figure out a query that does what I want.

SELECT listID, COUNT(*) AS Occurrences
FROM componentsToLists
WHERE componentID = ANY(
SELECT components.id
FROM components
WHERE components.name IN(nut,bolt))
GROUP BY listID
ORDER BY Occurrences DESC;

This ranks a set of lists based on the number of named parts the  
contain in them.  anyone either a) know how to rewrite this for  
version  4.1 or b) make it faster.


-Ben

On Aug 24, 2006, at 2:27 AM, Ben Lachman wrote:

I am fairly new to SQL and have run into a problem I can't figure  
out.  I am trying to construct a query that returns an occurrence  
ranked list of results.


I have the following tables and fields:

components

id
name

componentsToPartsList
---
componentID
listID

partsLists
--
id
name

I want to get results ranked by the number of components listed in  
a query that are in the same list.  For example, list id 1 with the  
name 'robot' has parts bolt (component id 1), pincer (component id  
3), and wheel (component id 4).  List id 2 with name 'nuts and  
bolts' has bolt and nut (component id 2) only in it.  If I pass in  
bolt, pincer and wheel I'd like to get back  first 'robot' and then  
'nuts and bolts.' If I pass in nut and bolt I'd like to get back  
'nuts and bolts' and then 'robot.'  I have a query that will return  
the relevant partsListIDs:


SELECT componentsToPartsList.listID
FROM componentsToPartsList
WHERE componentsToPartsList.componentID IN(
			(SELECT components.id FROM components WHERE components.name =  
nut),
			(SELECT components.id FROM components WHERE components.name =  
bolt);

}

But in the case of this query there are duplicates in the result. I  
would like to use these duplicates to rank (I assume using ORDER  
BY) the results based on the number of duplicates.  Can anyone  
recommend a good method of doing this?


-Ben



--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]



Re: Occurrence-based ranking [solved?]

2006-08-25 Thread Peter Brawley




Ben

This ranks a set of lists based on the number of named parts 
the
contain in them. anyone either a) know how to rewrite this 
for version
 4.1 or b) make it faster.


SELECT l.listID, COUNT(*) AS Occurrences
FROM componentsToLists AS l
INNER JOIN components AS c ON l.componentID=c.ID
WHERE c.name='nut' OR c.name='bolt'
GROUP BY l.listID
ORDER BY Occurrences DESC;

PB

-


Ben Lachman wrote:
I managed to figure out a query that does what I want.
  
  
SELECT listID, COUNT(*) AS Occurrences
  
FROM componentsToLists
  
WHERE componentID = ANY(
  
 SELECT components.id
  
 FROM components
  
 WHERE components.name IN("nut","bolt"))
  
GROUP BY listID
  
ORDER BY Occurrences DESC;
  
  
This ranks a set of lists based on the number of named parts the
contain in them. anyone either a) know how to rewrite this for version
 4.1 or b) make it faster.
  
  
-Ben
  
  
On Aug 24, 2006, at 2:27 AM, Ben Lachman wrote:
  
  
  I am fairly new to SQL and have run into a
problem I can't figure out. I am trying to construct a query that
returns an occurrence ranked list of results.


I have the following tables and fields:


components



id

name


componentsToPartsList

---

componentID

listID


partsLists

--

id

name


I want to get results ranked by the number of components listed in a
query that are in the same list. For example, list id 1 with the name
'robot' has parts bolt (component id 1), pincer (component id 3), and
wheel (component id 4). List id 2 with name 'nuts and bolts' has bolt
and nut (component id 2) only in it. If I pass in bolt, pincer and
wheel I'd like to get back first 'robot' and then 'nuts and bolts.' If
I pass in nut and bolt I'd like to get back 'nuts and bolts' and then
'robot.' I have a query that will return the relevant partsListIDs:


SELECT componentsToPartsList.listID

FROM componentsToPartsList

WHERE componentsToPartsList.componentID IN(

 (SELECT components.id FROM components WHERE components.name
= "nut"),

 (SELECT components.id FROM components WHERE components.name
= "bolt");

 }


But in the case of this query there are duplicates in the result. I
would like to use these duplicates to rank (I assume using ORDER BY)
the results based on the number of duplicates. Can anyone recommend a
good method of doing this?


-Ben

  
  
  
--MySQL General Mailing List
  
For list archives: http://lists.mysql.com/mysql
  
To unsubscribe:
http://lists.mysql.com/[EMAIL PROTECTED]
  
  
  
  
--No virus found in this incoming message.
  
Checked by AVG Free Edition.
  
Version: 7.1.405 / Virus Database: 268.11.6/427 - Release Date:
8/24/2006
  
  
  



No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.405 / Virus Database: 268.11.6/427 - Release Date: 8/24/2006


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]

Occurrence-based ranking

2006-08-24 Thread Ben Lachman
I am fairly new to SQL and have run into a problem I can't figure  
out.  I am trying to construct a query that returns an occurrence  
ranked list of results.


I have the following tables and fields:

components

id
name

componentsToPartsList
---
componentID
listID

partsLists
--
id
name

I want to get results ranked by the number of components listed in a  
query that are in the same list.  For example, list id 1 with the  
name 'robot' has parts bolt (component id 1), pincer (component id  
3), and wheel (component id 4).  List id 2 with name 'nuts and bolts'  
has bolt and nut (component id 2) only in it.  If I pass in bolt,  
pincer and wheel I'd like to get back  first 'robot' and then 'nuts  
and bolts.' If I pass in nut and bolt I'd like to get back 'nuts and  
bolts' and then 'robot.'  I have a query that will return the  
relevant partsListIDs:


SELECT componentsToPartsList.listID
FROM componentsToPartsList
WHERE componentsToPartsList.componentID IN(
(SELECT components.id FROM components WHERE components.name = 
nut),
			(SELECT components.id FROM components WHERE components.name =  
bolt);

}

But in the case of this query there are duplicates in the result. I  
would like to use these duplicates to rank (I assume using ORDER BY)  
the results based on the number of duplicates.  Can anyone recommend  
a good method of doing this?


-Ben

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]