2009-12-03 117 views
0

我拥有包含列表,类别和映射它们的表格。因此,列表可以放在多个类别中。像下面这样:MySQL为多个条件返回不同的结果

listings table 
    id 
    title 
    etc 

categories table 
    id 
    category_name 
    etc 

map table 
    listing_id 
    category_id 

当我需要把所有的信息在单个类别中的列表(在这种情况下,与18的ID的类),以下工作正常:

SELECT * 
FROM (`listings`, `map`) 
WHERE `map`.`category_id` = 18 
AND map.listing_id = listings.id 

我的问题是我如何做类似的查询类型,但现在我需要找到两个类别内的不同列表。例如,如果我只需要返回category_id = 18和category_id = 20中的不同列表,那该怎么办?这是否需要某种类型的连接?

+0

你想排除你的结果的列表设置,如果它是在更不仅仅是你指定的两个类别? – 2009-12-03 18:38:03

回答

2

是的,你会想要使用(另一个)加入。我认为有以下应该这样做:

SELECT lst.`id`, lst.<column>, ... 
FROM `listings` lst, `map` m, `map` m2 
WHERE m.`category_id` = 18 AND m2.`category_id` = 20 
AND m.`listing_id` = lst.`id` 
AND m2.`listing_id` = lst.`id` 

另一个版本,由生殖的建议的启发,但是这一个工程(注意我换成idcategory_id为清楚起见):

select l.listing_id 
from listings l 
join (select m.listing_id, count(*) as cnt from map m where 
    m.category_id in (18,20) 
    group by m.listing_id) cat_matches 
    on cat_matches.listing_id = l.listing_id 
where cat_matches.cnt = 2; -- 2 is the number of distinct categories to match 

丑女诶?和子选择可能不是所有有效的...但:


select l.listing_id 
from listings l 
join map m on l.listing_id=m.listing_id 
where m.category_id in (18,20) 
group by l.listing_id 
having COUNT(*)=2; 

你可以得到你所需要的所有行,然后筛选它们消除子查询中。请注意,此解决方案假定映射表中的行是唯一的(应该是这种情况,因为PK应在listing_idcategory_id之间定义)。

+0

非常感谢,完美工作 – Frank 2009-12-03 18:51:12

+1

每次需要使用此方法的其他类别时,您都需要继续加入地图表 – Germ 2009-12-03 19:11:31

+0

同意,Germ的解决方案可能是针对此问题的更好解决方案。 – 2009-12-03 19:13:43

1

这应该工作

select * from listings l 
join map m on m.listing_id = l.id 
join categories c on c.id = m.category_id 
where c.id in (18, 20) 
+0

正确加入+1! – 2009-12-03 18:40:17

+0

@pcampbell:SQL99 JOINs更准确 – 2009-12-03 18:44:50

+0

感谢您的帮助,我在解决此问题方面遇到了一些问题。 – Frank 2009-12-03 18:54:48

0

这个怎么样...

​​

select * from listings l, map m, categories c 
where l.id = m.listing_id 
and m.category_id = c.id 
and c.id in (18, 20) 
+0

这甚至不会运行,在单个查询中不能有两个'WHERE'子句。 – 2009-12-03 21:28:11

+0

你明白了:)固定 – Germ 2009-12-03 22:47:54

相关问题