2017-11-14 19 views
0

ここでは、内部テーブルSEARCHED_TAGSとUSERテーブルを結合しようとしています。ここでは、同じ結合を3回使用します。これだけでなく、このクエリを何度も使用します。クエリが遅くなる原因はありますか&このクエリを3回ではなく1回書くことができますか?1つの内部結合を追加する方法3つの内部結合の代わりに

以下はクエリです。

(
select st.SEARCH_TEXT as SEARCH_TEXT 
from SEARCHED_TAGS st 
inner join USER usr 
on st.SEARCH_BY=usr.USER_ID 
where (st.SEARCH_TEXT like :tagText) and (st.SEARCH_BY = :userId) and (usr.DEP_ID = :userDep) 
order by st.SEARCH_TIME desc 
limit 2 
) 
UNION 
(
select st.SEARCH_TEXT as SEARCH_TEXT 
from SEARCHED_TAGS st 
inner join USER usr 
on st.SEARCH_BY = usr.USER_ID 
where (st.SEARCH_TEXT like :tagText) and not (st.SEARCH_BY = :userId) and (usr.DEP_ID = :userDep) 
order by st.SEARCH_TIME desc 
limit 2 
) 
UNION 
(
select st.SEARCH_TEXT as SEARCH_TEXT 
from SEARCHED_TAGS st 
inner join USER usr 
on st.SEARCH_BY= usr.USER_ID 
where (st.SEARCH_TEXT like :tagText) and not (st.SEARCH_BY = :userId) and not (usr.DEP_ID = :userDep) 
order by st.SEARCH_TIME desc 
limit 2 
) 

上記の代わりにこのように記述できますか?

inner join USER usr 
on st.SEARCH_BY=usr.USER_ID 
(
select st.SEARCH_TEXT as SEARCH_TEXT 
from SEARCHED_TAGS st 
where (st.SEARCH_TEXT like :tagText) and (st.SEARCH_BY = :userId) and (usr.DEP_ID = :userDep) 
order by st.SEARCH_TIME desc 
limit 2 
) 
UNION 
(
select st.SEARCH_TEXT as SEARCH_TEXT 
from SEARCHED_TAGS st 
where (st.SEARCH_TEXT like :tagText) and not (st.SEARCH_BY = :userId) and (usr.DEP_ID = :userDep) 
order by st.SEARCH_TIME desc 
limit 2 
) 
UNION 
(
select st.SEARCH_TEXT as SEARCH_TEXT 
from SEARCHED_TAGS st 
where (st.SEARCH_TEXT like :tagText) and not (st.SEARCH_BY = :userId) and not (usr.DEP_ID = :userDep) 
order by st.SEARCH_TIME desc 
limit 2 
) 

おかげ..ため、制限文の

+0

@philipxy醜さは、私が思う限界文から来ています。 –

+1

あなたのクエリ以外の方法で何をしようとしているのか、あなたの質問がおそらくそれをしていないように思われるので、助けになります。また、[mcve]を読んで行動してください。 – philipxy

答えて

1

、これはあなたが通常のMySQLでできる最善のかもしれません。

SELECT SEARCH_TEXT 
FROM 
(
    SELECT SEARCH_TEXT, grp, 
     (@num:=if(@group = grp, @num +1, if(@group := grp, 1, 1))) row_number 
    FROM 
    (
     SELECT 
      st.SEARCH_TEXT as SEARCH_TEXT, 
      st.SEARCH_TIME, 
      CASE WHEN (st.SEARCH_TEXT like :tagText) AND (st.SEARCH_BY = :userId) AND 
         (usr.DEP_ID = :userDep) THEN 1 
       WHEN (st.SEARCH_TEXT like :tagText) AND NOT (st.SEARCH_BY = :userId) AND 
         (usr.DEP_ID = :userDep) THEN 2 
       WHEN (st.SEARCH_TEXT like :tagText) AND NOT (st.SEARCH_BY = :userId) AND NOT 
         (usr.DEP_ID = :userDep) THEN 3 
       ELSE 4 END AS grp 
     FROM SEARCHED_TAGS st 
     INNER JOIN USER usr 
      ON st.SEARCH_BY = usr.USER_ID 
    ) t1 
    CROSS JOIN (select @num:=0, @group:=null) t2 
    ORDER BY grp, t1.SEARCH_TIME DESC 
) t 
WHERE 
    t.row_number <= 2 AND 
    t.grp <= 3; 

このコードは、クエリが簡単にテストのためには複雑すぎる主な理由、テストされていないですが、何か問題が発生した場合、私はあなたと一緒に繰り返すことができます。しかし、セッション変数を使用して、我々は少し良く行うことができます。

関連する問題