2008-08-06 15 views
20

私は次のクエリアウトしようとしている:MySQLで結果セット全体をどのように連結するのですか?

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件の問い合わせ、kindasortaです。ただし、戻ってくる結果セットには、照会#3の結果(照会#1の結果(望ましくない))が反映されます。

これらの優先順位を決める方法はありますか。その結果は、クエリ#1、すべてのクエリ#2、すべてのクエリ#3の順になりますか?私はPHPでこれをやってみたい(最初のクエリで2番目に表示されないように表示された結果を制御する必要はありません。

答えて

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 
3

あなたが望むそれらを注文することは理にかなって並べ替えがない場合は、労働組合一緒に結果がありません、副選択として

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 
0

のようなものをそれを行うことができます - ちょうど3つの別々のレコードセットを返しますそれに応じてデータ層で処理します。

6

あなたがそうのように、全体的な結果セットをソートするために使用するハードコーディングされた値を持つ追加の列を追加:

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 
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 

合計4つの「列」から5つの結果が得られ、私に必要なものを提供します。自然な結果セット(AJAXの上に来る)、そして直後のワイルドカードの結果セット。

:)

1

テーブルからOとして( SELECT A、B、C、1とは異なる、B、Cを選択/ MP WHEREフィールドLIKE 'クエリ%' UNION SELECT A 、B、C、2 o FROMテーブルWHEREフィールドLIKE '%クエリ' UNION SELECT A、B、C、3 FROMテーブルWHEREフィールドLIKE '%query%' ) ORDER BY o ASC LIMIT 5

私のやり方ですか?私はその鱗の大きさを知りません。私は

GROUP BY B ORDER BY B ASC LIMIT 5 

を理解していない

それが唯一の労働組合の最後のSELECTに適用されますか?

実際には、列でグループ化することはできますが、それでも他の列には集計はできませんか?

EDIT:aaahh。私は実際にはmysqlがそれを参照してください。 DISTINCT(b)などの特別なバージョンです。私はその分野の専門家になろうとしません:)

0

UNIONには2種類あります。あなたが本当に言いたいことを、多くの場合

'UNION' and 'UNION ALL' 

それが実行時間の面で貯蓄のかなりになることができますセット間の重複排除を(SELECT DISTINCTを考えて)行わないようUNION ALLです。

他の人は、実行可能な解決策であることを示唆していますが、WAN経由で接続されている時間の影響を受けやすいアプリケーションやアプリケーションでは、サーバーとクライアントの間で大幅な往復が発生する可能性があります。

関連する問題