【发布时间】:2015-10-16 13:49:38
【问题描述】:
我有一个这样的查询,我觉得它可以更短更烂。有人有想法吗?
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 实现上述查询?
编辑:我在现实中的查询:(关注前两个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
【问题讨论】:
-
既然字符串在两种情况下都是相同的('anything'),你为什么需要联合呢?
-
@a1ex07 因为第一个查询有
and col2 in('10') -
但是第二个将返回第一个返回的所有内容和一些额外的行(其中 col2 不在 ('10') 中)。
-
@a1ex07 是的,我这样做只是为了
order。我需要显示第一个查询的结果,然后显示第二个查询的结果 -
所以您希望某些行出现两次,对吗?
标签: mysql join optimization union-all