1

だから、私は次のクエリを変更しようとしています:

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 CONCAT('%', flow_strings.sql_regex, '%')
ORDER BY flow.parent DESC, RAND()

クエリは、想定どおりに機能します。ただし、少し変更する必要があります。priorityテーブルのINT列を想定して、に等しいflow結果のみを取得するように変更するにはどうすればよいですか?flow.priorityMAX(priority)

つまり、クエリが実行するのとまったく同じように実行する必要がありますが、優先度の値がある場合は、最も高い優先度からのみ選択するようにします。優先度の高い値が複数ある場合は、両方を選択する必要があります。

同じ質問をしているように見えるStackOverflowの他の投稿を見たことがありますが、回答は解決策を説明していないようです。それらは回答を投稿するだけです。何が起こっているのか説明していただければ幸いです!ありがとう!

4

3 に答える 3

0

このように試しましたか

WHERE
    (
        flow.parent = 0
        OR flow.parent = :user_flow
    ) AND
    flow.priority = (Select Max(priority) From Flow)
于 2012-11-10T06:31:06.440 に答える
0

これが最も単純で最も非効率的な答えです:

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 CONCAT('%', flow_strings.sql_regex, '%')
    AND priority=(SELECT MAX priority FROM flow)
ORDER BY flow.parent DESC, RAND()
于 2012-11-10T06:33:58.660 に答える
0

これを解決する1つの方法は、サブクエリを使用することです。

SELECT *
FROM flow f
INNER JOIN flow_strings
    USING(node_id)
WHERE
    (
        f.parent = 0
        OR f.parent = :user_flow
    )
    AND f.source = 0
    AND :input LIKE CONCAT('%', flow_strings.sql_regex, '%')
    AND priority=(SELECT MAX(priority) FROM flow f2 where [grouping condition])
ORDER BY flow.parent DESC, RAND()

このようにして、グループ化条件を満たす行の中で最も優先度の高い行のみを選択します。通常、これは、メインテーブルの1つ以上のフィールドと、サブクエリの対応するフィールドの間の同等性です。たとえば、あなたの場合は次のようになります。

f.parent=f2.parent

(これは私の推測です、私はあなたのテーブルの意味を正確に知りません。

于 2012-11-10T08:03:41.253 に答える