2017-07-31 1 views
1

私のクエリは3つのテーブルからデータを選択し、結果を 'タイトル'(1つのテーブルには、参照する必要があるカラムとして 'description'があります)として設定します。また、後でフロントエンドフィルタに使用するテーブルがあることを示す値を持つ結果 'doctype'を作成します。これにより、その後の受注:共用体によるサブクエリの数すべて

  1. 結果が
  2. 結果はどこか途中
  3. 結果は私が必要なものSEARCHTERM

で終わる検索語がそれぞれのカウントを取得することで含まれてい検索語で始まりますクエリ内のサブクエリ:

SELECT * FROM (
    SELECT Title as title, 'docs' AS 'doctype' FROM docs 
    WHERE status IN ('publish', 'draft', 'review') AND Title LIKE '%' :searchterm '%' 
UNION ALL 
    SELECT Title as title, 'sheets' AS 'doctype' FROM sheets 
    WHERE status IN ('publish', 'draft', 'review') AND Title LIKE '%' :searchterm '%' 
UNION ALL 
    SELECT Description AS title, 'pres' AS 'doctype' from presentations 
    WHERE status IN ('publish', 'draft', 'review') AND Description LIKE '%' :searchterm '%' 
) FINAL 
    ORDER BY 
     CASE 
     WHEN title LIKE :searchterm '%' THEN 1 
     WHEN title LIKE '%' :searchterm THEN 3 
     ELSE 2 
     END 
    LIMIT 300 

さらに、al ORDER BYのias name( 'title')。

+0

を更新しましたおそらく最悪の方法です^^ – GrumpyCrouton

+0

あなたはmysqlとsql-serverの両方を持つことができません - 無関係なタグを削除してください。 – Eli

+0

ありがとうございます@エリは – DJC

答えて

0

あなたのサブクエリにカウント・フィールドとGROUPBY句を追加し

は、私の解決策は別に、これらの検索用語を実行し、その数をカウントすることで、これでしょう、私の頭の上から

SELECT 
(SELECT count(*) FROM docs WHERE status IN ('publish', 'draft', 'review') AND Title LIKE '%' :searchterm '%') as 'count_docs' 
,(SELECT count(*) FROM sheets WHERE status IN ('publish', 'draft', 'review') AND Title LIKE '%' :searchterm '%') as 'count_sheets' 
,(SELECT count(*) FROM presentations WHERE status IN ('publish', 'draft', 'review') AND Description LIKE '%' :searchterm '%') as 'count_pres' 
, FINAL.* 
FROM (
    SELECT Title as title, 'docs' AS 'doctype' FROM docs 
    WHERE status IN ('publish', 'draft', 'review') AND Title LIKE '%' :searchterm '%' 
UNION ALL 
    SELECT Title as title, 'sheets' AS 'doctype' FROM sheets 
    WHERE status IN ('publish', 'draft', 'review') AND Title LIKE '%' :searchterm '%' 
UNION ALL 
    SELECT Description AS title, 'pres' AS 'doctype' from presentations 
    WHERE status IN ('publish', 'draft', 'review') AND Description LIKE '%' :searchterm '%' 
) as FINAL 
    ORDER BY 
     CASE 
     WHEN title LIKE :searchterm '%' THEN 1 
     WHEN title LIKE '%' :searchterm THEN 3 
     ELSE 2 
     END 
    LIMIT 300 
+0

すべての結果を表示しているようだとエラーがないようです - しかし、どのように私は3つの値にアクセスするのですか?各行には値1のcntがあるようです。また、なぜGROUP BYが必要ですか? – DJC

+0

@CIvemy私はそれが初めて間違っていたと思う、代わりに今更新されたものを試してみてください。私は自分自身をテストすることはできませんので、SQLエラーがある場合は教えてください。 ところで、count_docs、count_sheets、およびcount_presの値は、常にすべての行で同じになります。その結果、結果セットは冗長になります。 パフォーマンス面では、この合計のカウントに対して別のクエリを使用する方がよいでしょう。 – RudiBR

関連する問題