2015-10-16 29 views
0

我有这样的查询:为什么外部顺序不能正确工作?

SELECT @rank := @rank + 3 `rank`, id, subject, name 
    FROM quran, (select @rank := -2) q 
    WHERE MATCH (subject, name) AGAINST ('anything') and aye IN ("10") 

UNION DISTINCT 

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

UNION ALL 

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

ORDER BY rank LIMIT 0, 11 

现在我优化我的查询和组合拖车第一SELECT第一个,像这样:(因为它们具有相同的表名)

(SELECT @rank1 := @rank1 + 2 `rank`, id, subject, name 
    FROM quran, (select @rank1 := -1) q 
    WHERE MATCH (subject, name) AGAINST ('anything') 
     ORDER BY CASE WHEN aye IN ('10') 
      THEN 0 
      ELSE 1 
     END 
) 

UNION ALL 

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

ORDER BY rank LIMIT 0, 11 

但我不知道为什么这种结果与第一个查询不相同。为什么?我该如何解决它?


编辑:下面是一些例子:

// quran        // hadith 
+----+---------+--------+    +----+---------+-------+ 
| id | subject | name |    | id | subject | byA | 
+----+---------+--------+    +----+---------+-------+ 
| 1 | hello | jack |    | 1 | blue | jack | 
| 2 | blue | peter |    | 2 | how  | hello | 
| 3 | jack | red |    | 3 | jack | blue | 
| 4 | back | blue |    +----+---------+-------+ 
| 10 | jack | how | 
+----+---------+--------+ 

现在,我想这输出:所以首要任务是$number,然后subject列,然后name列,另外,两个表的结果是交替的。

$anything = 'jack', $number = 10 
+----+---------+--------+ 
| id | subject | name | 
+----+---------+--------+ 
| 10 | jack | how | 
| 3 | jack | blue | 
| 3 | jack | red | 
| 1 | blue | jack | 
| 1 | hello | jack | 
+----+---------+--------+ 
+0

这些查询看起来非常不同于我。在一种情况下,您正在递增“2”,另一个则是“3”。所以,队伍会有所不同。也许你应该解释你正在尝试做什么。 –

+0

好的我想要这个:第一个查询的焦点:第一个查询的选择和第二个'select'返回一些重复的行,现在我想阻止这种情况(在这种情况下'UNION DISTINCT'像'UNION ALL'一样工作)。另外我想我可以写一个'select'而不是两个第一个'select'(因为表名是相同的)。完全我的目的是排序。我想在结果顶部显示第一个“select”的结果。 – stack

+0

我宁愿看到原始的数据源和预期的结果集,而不是所有这些奇怪的查询:-) – Alex

回答

1

我并不是说这是最好的办法,但它是对现有企图的最小修改。

(
    SELECT IF(aye IN ("10"), 0, 1) AS sortGroup 
    , IF(aye IN ("10"), @rank := @rank + 3, @rank1 := @rank1 + 3) AS `rank` 
    , id, subject, name 
    FROM quran 
    , (select @rank := -2) AS rq, (select @rank1 := -1) AS r1q 
    WHERE MATCH (subject, name) AGAINST ('anything') 
) 
UNION ALL 
(
    SELECT 2 AS sortGroup 
    , @rank2 := @rank2 + 2 `rank` 
    , id, subject, byA 
    FROM hadith 
    , (select @rank2 := 0) AS q 
    WHERE MATCH (subject) AGAINST ('anything') 
) 
ORDER BY sortGroup, rank 
LIMIT 0, 11 

其实,我并不积极,你可以合并前两个联合查询并得到相同的结果。在原始查询中,使用UNION DISTINCT和原始单独计算排名,满足aye IN ("10")条件的记录可能会经常出现两次(但具有不同的排名值)。

+0

谢谢,我试图运行它,请给我一下... – stack

+0

:-)!这个查询有点复杂,我测试了它,它有几乎正确的排序,并且它是好的。但是它的持续时间超过了我的第一个查询(三个'select'子句)。不管怎样,谢谢。 +1 – stack