несколько условий в одном столбце - PullRequest
0 голосов
/ 29 февраля 2012

Я видел несколько сообщений на эту тему, но я не вижу ни одной, которая отвечала бы на мой вопрос.

По сути, в моей базе данных есть 3 таблицы, которые относятся к членам и их категоризации / классификации.

  1. членов (определяет список членов и связанных данных)
  2. member_taxonomy (определяет категории, подкатегории и объекты, используя комбинацию идентификатора участника и перечисляемого поля 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 не будет работать, поскольку оно эффективно возвращает любые строки, которые соответствуют любому из этих конкретных значений, но это неверно, поскольку оно должно точно соответствовать указанным значениям.

Надеюсь, кто-нибудь может дать мне несколько указателей в правильном направлении.

Заранее спасибо.

UPDATE

Возможно, что 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

Следовательно, любой tax_type без установленного родительского идентификатора относится к категории CATEGORY верхнего уровня. У подкатегорий есть parent_id CATEGORY. КЛАССИФИКАЦИЯ может иметь parent_id для CATEGORY, а FACILITY иметь parent_id для CATEGORY.

Поэтому, например, категория может быть размещением, подкатегория - гостиницей, а объект - Wi-Fi. Поэтому, если у участника есть все три из этих элементов, они будут иметь 3 записи в таблице сопоставления. Мне нужно иметь возможность фильтровать их так, чтобы он формировал запрос для фильтрации в зависимости от типов размещения (т. Е. Подкатегорий - те записи с таксоном типа CATEGORY, но также имеющие родительский идентификатор, а затем в рамках этой классификации. Запрос может вернуть несколько записей для одного и того же члена, но я могу решить эту проблему, отфильтровав их с помощью дополнительных предложений SQL.

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012
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 голос
/ 29 февраля 2012
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
   ;
0 голосов
/ 28 апреля 2016

Вам нужно присоединиться 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;
...