だから、私は紛らわしいMySQLの問題を抱えています。いくつかの IF ステートメントを使用する必要があるように感じますが、この状況にそれらを実装する方法が本当にわかりません! まず、次のクエリを検討してください。それは簡単です:
SELECT *
FROM flow
INNER JOIN flow_strings
USING(node_id)
WHERE
(
flow.parent = 0
OR flow.parent = :user_flow
)
AND flow.source = 0
AND :input LIKE flow_strings.sql_regex
しかし、私はそれを拡張する必要があり、それが私が立ち往生している場所です. これを考えてみると、どう説明したらいいのかよくわからないので、以下にテーブル構造といくつかの例を示します。
テーブルflow
+---------+--------+--------+
| node_id | parent | source |
+---------+--------+--------+
| 1 | 0 | 0 |
+---------+--------+--------+
| 2 | 0 | 0 |
+---------+--------+--------+
| 3 | 1 | 1 |
+---------+--------+--------+
| 4 | 3 | 0 |
+---------+--------+--------+
テーブルflow_strings
+----------------+---------+-----------+
| flow_string_id | node_id | sql_regex |
+----------------+---------+-----------+
| 1 | 1 | fish |
+----------------+---------+-----------+
| 2 | 1 | wish |
+----------------+---------+-----------+
| 3 | 1 | *yes* |
+----------------+---------+-----------+
| 4 | 2 | *no* |
+----------------+---------+-----------+
| 5 | 2 | nay |
+----------------+---------+-----------+
| 6 | 3 | *herp* |
+----------------+---------+-----------+
[ ... ]
テーブルplaceholder_variables
+-------------+--------+------+-------+
| variable_id | source | name | value |
+-------------+--------+------+-------+
| 1 | 0 | yes | sure |
+-------------+--------+------+-------+
| 2 | 0 | yes | yeah |
+-------------+--------+------+-------+
| 3 | 0 | no | nope |
+-------------+--------+------+-------+
| 4 | 1 | herp | derp |
+-------------+--------+------+-------+
今、これが私がに基づいて起こる必要があることです:input
。
「魚」、「願い」、「確かに」、または「ええ」 --- SELECT flow.node_id
1
- これは、"fish"、"wish"、および "*yes*" がすべて 1 に関連付けられている
flow.node_id
ためです。 *yes* はアスタリスクで囲まれているため、"yes" が文字どおりに解釈されるのではなく、 から値が引き出されることに注意してくださいplaceholder_variables
。
「いいえ」または「いいえ」 --- SELECT flow.node_id
2
- これは、"*no*" と "nay" が 2 に関連付けられている
flow.node_id
ためです。繰り返しますが、アスタリスクがあるため、"no" は文字どおりには解釈されませんが、"nopeplaceholder_variables
" "はflow_strings
表にありません。
「いいえ」と「*いいえ*」--- 一致しません
*no* が に含まれflow_strings
ていても、アスタリスク (および対応する placeholder_variable) がアスタリスクで囲まれているため、一致しないはずです。これは、文字どおりに解釈されるべきではなく、対応するプレースホルダー変数の値によってのみ評価できることを意味します。
「赤ちゃん」 ---一致しません
- 「baby」にはアスタリスクが付いていませんが、
flow.node_id
3 に対応し、そのノードのノードflow.source
は 1 です。
"derp" ---一致しません
- これは、テーブル
placeholder_variables.source
にあるにもかかわらず、*herp* が 1 であるためです。flow_strings
"*herp*" --- SELECT flow.node_id
4
- 表の *herp* の周りにアスタリスクがありますが
flow_strings
、対応するのplaceholder_variable.source
は 1 です。
** 総括する **
- いいえ
source
= 1 sql_regex
がアスタリスクで囲まれている場合、placeholder_variables を解釈しますが、対応する placeholder_variablesource
が 0 の場合のみです。source
が 0 で、アスタリスクが存在しない場合は、sql_regex
文字どおりに解釈します。
MySQL を使用SUBSTRING()
してアスタリスクを操作できることはわかっています。また、(PHP を使用しているため) 理論的にはこれを 2 つのクエリに分割し、最初のクエリをループして 2 番目のクエリを動的に生成できることも知っています。ただし、これは A) メモリ集約的であり、B) ずさんです。
だから私の質問はこれです: MySQLだけを使ってこれを行うことは可能ですか? はいの場合、どのようにフォーマットすることをお勧めしますか? 私に代わってクエリを書く必要はありませんが、ロジックの一部を手伝っていただければ、とても感謝しています! すでに概説したこと以外に何を試すべきかまったくわかりませんし、絶対にやりたくありません。
ありがとう!