2016-11-07 48 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

相关问题