21

次のクエリを試しています。

SELECT A,B,C FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY B ASC LIMIT 5

これは 3 つのクエリがくっついたものです。ただし、返される結果セットは、望ましくないクエリ #1 の結果の前にクエリ #3 の結果を反映しています。

結果がクエリ #1 のすべて、次にクエリ #2 のすべて、次にクエリ #3 のすべてになるように、これらに優先順位を付ける方法はありますか? PHP ではまだこれを実行したくありません (最初のクエリで表示された結果を 2 番目のクエリで表示しないように制御する必要があることは言うまでもありません)。

4

8 に答える 8

16

おそらく、元のテーブルを示す 4 番目の列を含めてみて、それで並べ替えてグループ化する必要があります。

SELECT A,B,C, "query 1" as origin FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C, "query 2" as origin FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C, "query 3" as origin FROM table WHERE field LIKE '%query%'
GROUP BY origin, B ORDER BY origin, B ASC LIMIT 5
于 2008-08-06T18:59:36.467 に答える
7

次のように、結果セット全体を並べ替えるために使用するハードコードされた値を含む追加の列を追加します。

SELECT A,B,C,1 as [order] FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C,2 as [order] FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C,3 as [order] FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY [order] ASC, B ASC LIMIT 5
于 2008-08-06T18:55:45.243 に答える
2

次のようなサブセレクトとして実行できますか

SELECT * FROM (
    SELECT A,B,C FROM table WHERE field LIKE 'query%'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query%'
) ORDER BY B ASC LIMIT 5
于 2008-08-06T18:54:23.157 に答える
1

SELECT distinct a,b,c FROM ( SELECT A,B,C,1 as o FROM table WHERE field LIKE 'query%' UNION SELECT A,B,C,2 as o FROM table WHERE field LIKE '%query' UNION SELECT A,B,C,3 as o FROM table WHERE field LIKE '%query%' ) ORDER BY o ASC LIMIT 5

私のやり方でしょう。それがどのようにスケーリングするかわかりません。

私は理解していません

GROUP BY B ORDER BY B ASC LIMIT 5

ユニオンの最後の SELECT にのみ適用されますか?

mysql では、実際に列ごとにグループ化することはできますが、他の列で集計を行うことはできませんか?

編集:ああああ。mysqlが実際にそうしていることがわかります。DISTINCT(b) か何かの特別なバージョンです。私はその分野の専門家になりたいとは思いません:)

于 2008-08-06T19:41:52.607 に答える
0

必要な順序に並べ替える意味がない場合は、結果を結合しないでください。3 つの個別のレコードセットを返し、データ層で適切に処理してください。

于 2008-08-06T18:54:27.587 に答える
0

私は最終的に(すべての提案を見て)この解決策にたどり着きました。これは、必要なものと時間の間の少しの妥協点です。

SELECT * FROM 
  (SELECT A, B, C, "1" FROM table WHERE B LIKE 'query%' LIMIT 3
   UNION
   SELECT A, B, C, "2" FROM table WHERE B LIKE '%query%' LIMIT 5)
AS RS
GROUP BY B
ORDER BY 1 DESC

合計 5 つの結果を提供し、4 番目の「列」から並べ替えて、必要なものを提供します。自然な結果セット (AJAX 経由) と、ワイルドカード結果セットが直後に続きます。

:)

/mp

于 2008-08-06T19:19:53.993 に答える
0

UNION には 2 つのバリエーションがあります。

'UNION' and 'UNION ALL'

ほとんどの場合、実際に言いたいのは UNION ALL ですSELECT DISTINCT。これは、実行時間の点でかなりの節約になる可能性があるセット間の重複排除 (Think ) を行わないためです。

実行可能な解決策である複数の結果セットを提案する人もいますが、時間に敏感なアプリケーションや WAN 経由で接続されたアプリケーションでは、サーバーとクライアント間の回線での往復が大幅に増える可能性があるため、これには注意してください。

于 2008-09-17T16:21:48.967 に答える