2016-11-07 4 views
1

PHPのシステムを作成しようとしています。ここでは、注文の情報とこれらの回答の要件に基づいて自動回答を送信することができます。たとえば、顧客がproduct_id 20,30、および40の注文を受けているとします。私は答えの1つの要件を設定し、それが一致するかどうかをチェックして、それに対応する答えを送信できるようにしたいと考えています。多対1の状況で複数のIDに基づいて列から一意の値を選択する方法を教えてください。

現在、メッセージ自体とこれらのメッセージにリンクされている要件の2つのテーブルがあります。

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 

とそれらが一致するかどうかを確認し、私は将来的に設定されますどのように多くの答え/要件を知らないので、好ましいものではありません。これは、2番目の表に示す既知のプロダクト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 

これは私が欲しいものに近いものになります。それは、サブクエリで述べoption_idのいずれかと一致するため、このクエリanswer_ids

を返し
1 
2 

は、この場合2がポップアップ。

私の望む結果は、option_idsにマッチする単一のanswer_idを得ることです。 これは、私がこの特定のシステムの構造をどのように設定したのか、少し後であるかもしれません。しかし、将来、チェックするoption_typeは複数あります。今、私は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 

EDIT

上記のオプションは、サブクエリのかなり多くを作成することができます。 パフォーマンスが向上し、より洗練された別のオプションがあります。あなたは常にHAVING句のためにそれを製品IDを供給する必要があります

注意が、この方法ををソート: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

関連する問題