2012-02-29 40 views
0

已經看到多個帖子,但我看不到任何回答我的問題。同一列上的多個條件

基本上我有我的數據庫中3個表,其涉及到的成員和他們的分類/分類。

  1. 構件(定義成員的列表和相關聯的數據)
  2. member_taxonomy(定義類別,子類別並使用partent ID和枚舉字段TAX_TYPE(類別,子類別,FACILITY)
  3. member_taxonomy_map的組合設施(定義映射成員和member_taxonomy)

之間我有一個會員頁面內這是有多種選擇通過指定一個或多個類別,然後一個或多個設備,以優化搜索。我一直在試圖對TA搜索竹葉提取使用查詢:

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行這事做有多個,其中在同一列的條款,但我無法弄清楚這個查詢應該是什麼樣子。每次細化搜索(並且最多可以有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 

因此沒有父ID設置任何TAX_TYPE是頂級類別。子類別具有parent_id CATEGORY。 CLASSIFICATION可以有CATEGORY的parent_id,FACILITY有一個CATEGORY的parent_id。

因此例如一類可能是住宿,子類可能是酒店設施可能是無線網絡連接。因此,如果一個成員擁有全部三個這些項目,他們將在映射表中有3個條目。我需要能夠對這些進行過濾,以便它根據住宿類型建立查詢以進行過濾(即子類別 - 具有tax_type CATEGORY但具有父級ID的條目,然後在此分類中查詢。返回多個條目相同的成員,但我可以通過額外的SQL子句過濾這些出來處理這個

回答

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_id126;你可能試圖讓包含一個其他的記錄。

+0

絕對不可能有兩個不同的值。 :) – 2012-02-29 17:41:09

+0

查看更新的問題。 @MarcusAdams – 2012-03-01 10:57:29

+0

@NickRolando請檢查此:https://stackoverflow.com/questions/47167512/not-correct-result-two-conditions-for-one-field-in-mysql-where – user3770797 2017-11-07 21:13:50

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 
    ; 
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; 
相關問題