2015-10-16 1 views
0

У меня есть такой запрос, я чувствую, что он может быть короче и гнет. есть кто-нибудь идея?Как создать один подзапрос вместо объединения

select * from table where match(col1) against('anything') and col2 in('10') 
    union distinct 
select * from table where match(col1) against('anything') 

Теперь я хочу знать, я могу реализовать приведенный выше запрос с использованием sub-query или join?


Edit: Мой запрос в реальности: (фокус на двух первых select п)

SELECT @rank := @rank + 3 `rank`, id, subject, name, matnF, source, 'quran' which 
    FROM quran, (select @rank := -2) q 
    WHERE MATCH (`translate`, subject, name) AGAINST (:q) and aye IN (" .implode(',', $matches[0]) . ") 

UNION DISTINCT 

SELECT @rank1 := @rank1 + 3 `rank`, id, subject, name, matnF, source, 'quran' which 
    FROM quran, (select @rank1 := -1) q 
    WHERE MATCH (`translate`, subject, name) AGAINST (:q) 

UNION ALL 

SELECT @rank2 := @rank2 + 3 `rank`, id, subject, byA, matnF, source, '' `translate`, 'hadith' which 
    FROM hadith, (select @rank2 := 0) q 
    WHERE MATCH (subject) AGAINST (:q) 

ORDER BY rank LIMIT :j, 11 

То, что я хочу его с помощью CASE WHEN ... THEN ... для двух первого запроса и объединить их.


Edit2: Это выглядеть то, что я хочу:

(SELECT @rank1 := @rank1 + 2 `rank`, id, subject, name, matnF, source, 'quran' which 
    FROM quran, (select @rank1 := -1) q 
    WHERE MATCH (`translate`, subject, name) AGAINST (:q) 
     ORDER BY CASE 
      WHEN aye IN (" .implode(',', $matches[0]) . ") THEN 0 
      ELSE 1 
     END 
) 

    UNION ALL 

(SELECT @rank2 := @rank2 + 2 `rank`, id, subject, byA, matnF, source, '' `translate`, 'hadith' which 
     FROM hadith, (select @rank2 := 0) q 
     WHERE MATCH (subject) AGAINST (:q) 
) 

ORDER BY rank LIMIT :j, 11 
+0

поскольку строка является то же самое («что угодно») в обоих случаях, зачем вам вообще нужен союз? – a1ex07

+0

@ a1ex07, потому что первый запрос имеет 'и col2 in ('10')' – stack

+0

Но второй возвращает все первые возвращения и некоторые дополнительные строки (где col2 не в ('10')). – a1ex07

ответ

2

Если дубликаты не нужны, ниже запрос должен дать вам желаемый результат

select a.* 
from table1 a 
where match(col1) against('anything') 
ORDER BY 
CASE 
    WHEN col2 IN ('10') THEN 0 
    ELSE 1 
END 
; 
+0

Спасибо, +1. просто одно, на самом деле мой запрос сложный, но могу ли я дать вам мой реальный запрос, и вы делаете это на нем? – stack

+0

Несомненно. В следующий раз я бы рекомендовал задавать вопросы с минимальным рабочим примером, так что будет легче ответить ... – a1ex07

+0

Спасибо. https://gist.github.com/anonymous/287f1f02f244db5b0899 – stack

Смежные вопросы