2017-12-04 6 views
0

MySQLデータベースでは、私は3つのテーブル:customers,projectsおよびtasksを持っています。私が実装している検索では、3つのテーブルすべてを検索し、一致するものを選択したいと考えています。問題はMySQLが返す結果の量を等しく制限したいということです。MySQL - 合計LIMITでUNIONで等しい量をそれぞれ選択します

これは私が現在持っているクエリで例です。この例では

SELECT id, title, type 
FROM (
    (
    SELECT id, title, 'customer' AS type, MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) AS score 
    FROM customers 
    WHERE MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) 
    ) 
    UNION DISTINCT 
    (
    SELECT id, title, 'project' AS type, MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) AS score 
    FROM projects 
    WHERE MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) 
    ) 
    UNION DISTINCT 
    (
    SELECT id, title, 'task' AS type, MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) AS score 
    FROM tasks 
    WHERE MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) 
    ) 
) res 
LIMIT 6; 

、私はこの例のための私の希望endresultは以下れる6

に結果を制限したいです。

1)すべてのテーブルに少なくとも2つの結果がある場合は、それぞれに2つの結果を表示します。

id  title      type 
20  'First test customer'  'customer' 
22  'Test customer 2'   'customer 
48  'A project for testing' 'project' 
17  'Test Project'    'project' 
1  'Task test'    'task' 
2  'Second test'    'task' 

2)1つのテーブルに結果がない場合は、他の2つのテーブルごとに3つの結果を表示します。 (一つだけ表がその表6の結果を示し、その結果を持っている場合。)

id  title      type 
20  'First test customer'  'customer' 
22  'Test customer 2'   'customer 
56  'Customer test 56'   'customer' 
1  'Task test'    'task' 
2  'Second test'    'task' 
3  'Test task'    'task' 

3)テーブルの2が2つの以上の結果を有し、第3のテーブルのみが1件の結果がある場合、いずれかの検索結果を表示十分な結果が得られたテーブルのうち、2つのうちの他方のテーブルについては2つの結果が得られ、1つの結果のみを有するテーブルについては1が得られる。

id  title      type 
20  'First test customer'  'customer' 
48  'A project for testing' 'project' 
17  'Test Project'    'project' 
34  'Testing project'   'project' 
1  'Task test'    'task' 
2  'Second test'    'task' 

誰でもこの手伝いできますか?

ありがとうございます!

答えて

1

SELECTの各行に行番号を使用し、計算されたフィールドを持つUNIONを注文して、単一のクエリから得られた結果のバランスをとることができます(このコードをテストしませんでした。

SET @rank1=0; 
SET @rank2=0; 
SET @rank3=0; 
SELECT id, title, type, rank 
FROM (
    (

    SELECT @rank1:[email protected]+1 AS rank, id, title, 'customer' AS type, MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) AS score 
    FROM customers 
    WHERE MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) 
    ) 
    UNION DISTINCT 
    (

    SELECT @rank2:[email protected]+1 AS rank, id, title, 'project' AS type, MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) AS score 
    FROM projects 
    WHERE MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) 
    ) 
    UNION DISTINCT 
    (

    SELECT @rank3:[email protected]+1 AS rank, id, title, 'task' AS type, MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) AS score 
    FROM tasks 
    WHERE MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) 
    ) 
) res 
ORDER BY rank 
LIMIT 6; 
+0

答えてくれてありがとうございますが、MySQLでは 'SET'(構文エラー)を使用できませんでした。何故かあなたはなぜ知っている? – DylanVB

+0

@DylanVB私は答えを編集しました。おそらく、セット宣言文は選択外のものでなければなりません。 – kiks73

+0

クエリの外にある変数を宣言するのは実際には機能します。クエリ内に変数を設定する方法はありますか? – DylanVB

1

FROM句に(SELECT @rankX:=0) AS tを追加することができ、変数を宣言せず@rankX 1つのクエリでの@ kiks73結果を持っています。

SELECT id, title, type, rank 
FROM (
    (

    SELECT @rank1:[email protected]+1 AS rank, id, title, 'customer' AS type, MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) AS score 
    FROM customers,(SELECT @rank1:=0) AS t 
    WHERE MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) 
    ) 
    UNION DISTINCT 
    (

    SELECT @rank2:[email protected]+1 AS rank, id, title, 'project' AS type, MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) AS score 
    FROM projects,(SELECT @rank2:=0) AS t 
    WHERE MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) 
    ) 
    UNION DISTINCT 
    (

    SELECT @rank3:[email protected]+1 AS rank, id, title, 'task' AS type, MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) AS score 
    FROM tasks,(SELECT @rank3:=0) AS t 
    WHERE MATCH (title) AGAINST ('+test* ' IN BOOLEAN MODE) 
    ) 
) res 
ORDER BY rank 
LIMIT 6; 
関連する問題