同一列上的多个条件

时间:2012-02-29 17:23:47

标签: mysql sql relational-division

已经看过多篇帖子,但我看不出有什么能回答我的问题。

基本上我的数据库中有3个表与成员及其分类/分类有关。

  1. 成员(定义成员列表和相关数据)
  2. member_taxonomy(使用partent id和枚举字段tax_type(CATEGORY,SUBCATEGORY,FACILITY)的组合定义类别,子类别和设施
  3. member_taxonomy_map(定义成员和member_taxonomy之间的映射)
  4. 我有一个成员页面,其中有许多选项可以通过指定一个或多个子类别和一个或多个工具来优化搜索。我一直在尝试使用查询搜索表:

    SELECT members.*
    FROM (members)
    JOIN member_taxonomy_map ON member_taxonomy_map.member_id = members.id
    WHERE member_taxonomy_map.taxonomy_id =  1
    AND member_taxonomy_map.taxonomy_id =  26
    AND members.active =  1
    AND members.deleted =  0;
    

    但是这会返回0行,这与在同一列上有多个where子句有关,但我无法弄清楚这个查询的外观。每次搜索都被细化(最多可以有30个不同的选项来优化搜索)我需要添加一个额外的AND子句,以便只返回带有这些映射的成员。

    IN子句不起作用,因为它有效地返回任何与这些特定值匹配的行,但这是不正确的,因为它需要与指定的值完全匹配。

    希望有人可以给我一些正确方向的指示。

    提前致谢。

    更新

    taxonomy_id可能是1和26.我可能需要包含members_taxonomy_map表的模式。

    id int
    tax_name varchar
    slug varchar
    tax_type enum ('CATEGORY','CLASSIFICATION','FACILITY','RATING')
    parent_id int
    active int
    

    因此,没有设置父ID的任何tax_type都是顶级CATEGORY。子类别具有parent_id CATEGORY。 CLASSIFICATION可以有CATEGORY的parent_id,而FACILITY的parent_id为CATEGORY。

    因此,例如,一个类别可以是住宿,子类别可以是酒店,设施可以是wifi。因此,如果成员具有所有这三个项目,则它们将在映射表中具有3个条目。我需要能够过滤这些,以便根据住宿类型(即子类别 - 具有CATEGORY的tax_type但也具有父ID的那些条目,然后在此分类中)来构建查询以进行过滤。查询可能为同一个成员返回多个条目,但我可以通过使用额外的SQL子句过滤掉这些来处理它。

3 个答案:

答案 0 :(得分:3)

SELECT members.*
FROM (members)
JOIN member_taxonomy_map ON member_taxonomy_map.member_id = members.id
WHERE (member_taxonomy_map.taxonomy_id =  1
OR member_taxonomy_map.taxonomy_id =  26)
AND members.active =  1
AND members.deleted =  0;

记录可能无法taxonomy_id 1 26;您可能正在尝试获取包含一个另一个的记录。

答案 1 :(得分:1)

SELECT mb.*
FROM members mb
JOIN member_taxonomy_map tm ON tm.member_id = mb.id
WHERE tm.taxonomy_id IN ( 1, 26)
AND mb.active =  1
AND mb.deleted =  0
   ;

...或......

SELECT mb.*
FROM members mb
WHERE EXISTS ( SELECT *
     FROM member_taxonomy_map tm
     WHERE ON tm.member_id = mb.id
     AND tm.taxonomy_id IN ( 1, 26)
     )
AND mb.active =  1
AND mb.deleted =  0
   ;

...或......

SELECT mb.*
FROM members mb
WHERE  mb.id IN ( SELECT tm.member_id
     FROM member_taxonomy_map tm
     WHERE tm.taxonomy_id IN ( 1, 26)
     )
AND mb.active =  1
AND mb.deleted =  0
   ;

答案 2 :(得分:0)

您需要为每member_taxonomy_map

加入taxonomy_id
SELECT members.*
FROM members

JOIN member_taxonomy_map mtm1 ON mtm1.member_id = members.id AND mtm1.taxonomy_id=1

JOIN member_taxonomy_map mtm26 ON mtm26.member_id = members.id AND mtm26.taxonomy_id=26

WHERE members.active =  1
AND members.deleted =  0;