如何在多对一的情况下根据多个ID从列中选择唯一值?

时间:2016-11-07 17:52:37

标签: php mysql

我试图在PHP中创建一个系统,我可以根据订单中的信息和这些答案的要求发送自动答案。例如,如果客户的产品订单中包含product_id 20,30和40。我希望能够为其中一个答案设置一个要求,检查它是否匹配,然后发出相应的答案。

目前有两个表,一个用于消息本身,另一个用于链接到这些消息的要求。

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 个答案:

答案 0 :(得分: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子句已排序的产品ID,这样:20,30,40这样:{{ 1}}让它发挥作用。

30,20,40