2016-09-25 2 views
1

現在、私はユニオンクエリを実行する必要がある小さなPHPスクリプトで作業しています。 クエリから7つの要素を取り込み、別のクエリから1つの要素を両方とも同じテーブルで実行します。二つ目は2つのクエリのユニオンの問題

SELECT * FROM (
       select * from quiz 
       where id != '10' 
        and langage = 'ar' 
       order by nshares 
       DESC LIMIT 15) a 
order by rand() limit 7 

: は最初のものはこれです

select * from quiz 
where id != '10' 
    and langage = 'ar' 
order by qid DESC 
limit 1 

私は

SELECT * FROM (
       select * from quiz 
       where id != '10' 
        and langage = '$loga' 
       order by nshares DESC 
       LIMIT 15) a 
order by rand() 
limit 7 
union 
select * from quiz 
where id != '10' 
    and langage = '$loga' 
order by qid DESC 
limit 1 

をしようとしたが、誰の助けをしてくださいwork.Canように思わないのですか?

答えて

1

あなたは近くです。あなただけのサブクエリを括弧で囲む必要があります。

(select q.* 
from (select q.* 
     from quiz q 
     where id <> '10' and langage = '$loga' 
     order by nshares DESC 
     limit 15 
    ) q 
order by rand() 
limit 7 
) union 
(select q.* 
from quiz q 
where id <> '10' and langage = '$loga' 
order by qid desc 
limit 1 
); 

Hereは、構文が動作することを示すSQLフィドルです。

  • unionは重複を除去するためのオーバーヘッドを招きます。このオーバーヘッドを必要としない場合は、union allを使用する必要があります。
  • 2番目のクエリのランダムな行が最初のクエリと一致する可能性があるため、クエリは7または8行(一致するデータが十分あると仮定します)を返す可能性があります。
  • order byは、(サブクエリを使用しない限り)union/union allクエリの最後でのみ許可されているため、構文エラーです。
  • idが数字の場合は、比較に一重引用符を使用しないでください。これは人を混乱させ、オプティマイザを混乱させる可能性があります。
+0

発現が予想された。 (位置 "19"付近) 予期しないトークン(位置 "19"の近く) このタイプの句は以前に解析されました(位置20の "select"の近く) このタイプの句は以前解析されました認識されない文のタイプ(158位の "order by"の近く) –

+0

あなたのコードは機能していないようです。 –

+0

@TestilaSupport。*それは*働きます。 SQL Fiddle(と私はクエリで何も変更する必要はありませんでした) –