Вы можете заключить UNION
в подзапрос, а затем выполнить порядок снова:
SELECT *
FROM ((SELECT 'city' AS type, c.slug, c.name, c.city_id AS id
FROM city c
WHERE c.name LIKE '%ame%'
ORDER BY CASE
WHEN c.name = 'ame' THEN 0
WHEN c.name LIKE 'ame%' THEN 1
WHEN c.name LIKE '%ame%' THEN 2
WHEN c.name LIKE '%ame' THEN 3
ELSE 4 END,
c.name ASC
LIMIT 24 OFFSET 0)
UNION
(SELECT 'country' as type, c.slug, c.name, c.country_id AS id
FROM country c
WHERE c.name LIKE '%ame%'
ORDER BY CASE
WHEN c.name = 'ame' THEN 0
WHEN c.name LIKE 'ame%' THEN 1
WHEN c.name LIKE '%ame%' THEN 2
WHEN c.name LIKE '%ame' THEN 3
ELSE 4 END,
c.name ASC
LIMIT 24 OFFSET 0)) c
ORDER BY CASE
WHEN c.name = 'ame' THEN 0
WHEN c.name LIKE 'ame%' THEN 1
WHEN c.name LIKE '%ame%' THEN 2
WHEN c.name LIKE '%ame' THEN 3
ELSE 4 END,
c.name ASC
Было бы более эффективно создать столбец рейтинга:
SELECT *
FROM ((SELECT 'city' AS type, c.slug, c.name, c.city_id AS id,
CASE
WHEN c.name = 'ame' THEN 0
WHEN c.name LIKE 'ame%' THEN 1
WHEN c.name LIKE '%ame%' THEN 2
WHEN c.name LIKE '%ame' THEN 3
ELSE 4 END AS `rank`
FROM city c
WHERE c.name LIKE '%ame%'
ORDER BY `rank`, c.name ASC
LIMIT 24 OFFSET 0)
UNION
(SELECT 'country' as type, c.slug, c.name, c.country_id AS id,
CASE
WHEN c.name = 'ame' THEN 0
WHEN c.name LIKE 'ame%' THEN 1
WHEN c.name LIKE '%ame%' THEN 2
WHEN c.name LIKE '%ame' THEN 3
ELSE 4 END AS `rank`
FROM country c
WHERE c.name LIKE '%ame%'
ORDER BY `rank`, c.name ASC
LIMIT 24 OFFSET 0)) c
ORDER BY c.rank, c.name ASC
Это даст вам 48 результатов, по 24 от города и страны. Если вам нужны результаты с самым высоким рейтингом, независимо от того, из какой таблицы они получены, просто удалите предложения ORDER BY
и LIMIT
из UNION
:
SELECT *
FROM ((SELECT 'city' AS type, c.slug, c.name, c.city_id AS id
FROM city c
WHERE c.name LIKE '%ame%')
UNION
(SELECT 'country' as type, c.slug, c.name, c.country_id AS id
FROM country c
WHERE c.name LIKE '%ame%'
)) c
ORDER BY CASE
WHEN c.name = 'ame' THEN 0
WHEN c.name LIKE 'ame%' THEN 1
WHEN c.name LIKE '%ame%' THEN 2
WHEN c.name LIKE '%ame' THEN 3
ELSE 4 END,
c.name ASC
LIMIT 48 OFFSET 0