0

看过多篇关于此的帖子,但我看不到任何回答我的问题的帖子。

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

  1. 成员(定义成员列表和相关数据)
  2. member_taxonomy(使用partent id和枚举字段tax_type(CATEGORY、SUBCATEGORY、FACILITY)的组合定义类别、子类别和设施
  3. member_taxonomy_map(定义成员和 member_taxonomy 之间的映射)

我有一个成员页面,其中有许多选项可以通过指定一个或多个子类别和一个或多个设施来优化搜索。我一直在尝试使用查询在表上进行搜索:

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 都是顶级类别。子类别有一个 parent_id CATEGORY。CLASSIFICATION 的 parent_id 可以是 CATEGORY,而 FACILITY 的 parent_id 可以是 CATEGORY。

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

4

3 回答 3

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_idof1 26; 您可能正在尝试获取包含其中一个另一个的记录。

于 2012-02-29T17:28:28.197 回答
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
   ;
于 2012-02-29T17:33:16.010 回答
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;
于 2016-04-28T20:55:22.693 回答