2016-11-07 45 views
1

我試圖在PHP中創建一個系統,我可以根據他們的命令和這些答案的要求發送自動答案。例如,如果客戶訂購了20,30和40的product_id。我希望能夠爲其中一個答案設置要求,做一個檢查,如果它匹配,然後發出相應的答案。如何在多對一的情況下根據多個ID從列中選擇唯一值?

當前有兩個表,一個用於消息本身,另一個用於鏈接到這些消息的需求。

tickets_answers

id name message 
1  Test 1 This is the first test message. 
2  Test 2 Another test message 

tickets_answers_options

id answer_id option_type option_id 
1  1   product_id  20 
2  1   product_id  30 
3  1   product_id  40 
4  2   product_id  25 
5  2   product_id  30 

所有可用的答案循環,看看他們是否匹配是不優選的,因爲我不知道有多少答案/需求將在未來成立。這就是爲什麼我試圖根據第二個表中顯示的已知產品ID作爲option_ids檢索相應答案的原因。

該查詢將以PHP構建。我很可能會做一個內爆或基於訂單本身的信息構建查詢。現在我只是試着理清SQL部分。

我曾嘗試下面的查詢檢索answer_id

SELECT answer_id 
FROM tickets_answers_options 
WHERE option_id IN (SELECT option_id 
       FROM tickets_answers_options 
       WHERE option_type = 'product_id' 
         AND option_id = 20 
         OR option_id = 30 
         OR option_id = 40) 
       GROUP BY answer_id 

這導致一些接近我想要的東西。該查詢返回answer_ids

1 
2 

在這種情況下,2彈出,因爲它與在子查詢中提到的option_id之一匹配。

我希望的結果是得到一個與option_ids匹配的answer_id。 我看到這可能是我爲這個特定系統建立結構的一個倒退。但將來會有多個option_types進行檢查。現在我試圖只檢查product_id,在PHP中我可以爲不同的option_types設置多個查詢,所以確保一切都匹配。

我希望我在這裏發佈足夠的相關信息,如果沒有請讓我知道,所以我可以提供更多。並感謝您提前查看此事。

回答

1

不是很優雅,但你可以建立每個產品ID的子查詢,並加入所有的人:

SELECT a.answer_id 
FROM (SELECT t.answer_id 
    FROM tickets_answers_options t 
    WHERE t.option_type = 'product_id' 
    AND t.option_id = 20) as a 

    JOIN (SELECT t.answer_id 
    FROM tickets_answers_options t 
    WHERE t.option_type = 'product_id' 
    AND t.option_id = 30) as b 
ON a.answer_id = b.answer_id 

JOIN (SELECT t.answer_id 
    FROM tickets_answers_options t 
    WHERE t.option_type = 'product_id' 
    AND t.option_id = 40) as c 
ON a.answer_id = c.answer_id 

編輯

上面的選項會造成相當多的子查詢。 這是另一個可能有更好性能和更優雅的選擇。

需要注意的是,你總是需要給它的產品編號爲HAVING子句排序,這種方式:20,30,40這樣:30,20,40爲它工作。

SELECT t.answer_id, GROUP_CONCAT(DISTINCT(t.option_id) ORDER BY t.option_id) AS option_ids_found 
FROM tickets_answers_options t 
WHERE t.option_type = 'product_id' 
AND t.option_id in (20,30,40) 
GROUP BY t.answer_id 
HAVING option_ids_found = '20,30,40' 
+0

我的結構不是優雅的開始!它完美地返回了一個answer_id!幸運的是,我使用PHP構建查詢,並且可以輕鬆生成這些查詢。我將在明天對此查詢做一些進一步的測試,看看它是否適用於其他一些情況。感謝您的時間。 – Rimble

+1

@Rimble - 請參閱編輯在幾秒鐘內更好的選項 – Galz

+0

看起來很完美。排序產品ID不應該成爲問題。再次感謝! – Rimble

相關問題