【问题标题】:How to create one sub query instead of union如何创建一个子查询而不是联合
【发布时间】: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-queryjoin 实现上述查询?


编辑:我在现实中的查询:(关注前两个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


【解决方案1】:

如果不需要重复,下面的查询应该会给你想要的输出

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

【讨论】:

  • 谢谢,+1。只是一件事,实际上我的查询很复杂,但是,我可以给你我真正的查询,你在上面做这个吗?
  • 当然。下次我建议用最少的工作示例提问,这样会更容易回答......
  • 哦,应该注意的是,我无法删除该变量@rank,因为它用于对组合(使用union all)到此查询的另一个查询进行排序。
  • 更正:@rank := @rank + 2@rank1 := @rank1 + 2 (我喜欢的)
  • 你可以修改你的问题并将查询放在那里吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2021-10-23
相关资源
最近更新 更多