У меня есть такой запрос, я чувствую, что он может быть короче и гнет. есть кто-нибудь идея?Как создать один подзапрос вместо объединения
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
поскольку строка является то же самое («что угодно») в обоих случаях, зачем вам вообще нужен союз? – a1ex07
@ a1ex07, потому что первый запрос имеет 'и col2 in ('10')' – stack
Но второй возвращает все первые возвращения и некоторые дополнительные строки (где col2 не в ('10')). – a1ex07