2015-10-16 3 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 

Но Я не знаю, почему результат не совпадает с первым запросом. Зачем? И как я могу это исправить?


Edit: Вот некоторые примеры:

// 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

ok Я хочу это: фокус первого запроса: fist 'select', а второй' 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 

На самом деле, я не уверен вы можете объединить первые два unioned запросов и получить те же результаты. В исходном запросе с UNION DISTINCT и отдельным вычислением ранга в оригинале записи, которые удовлетворяют критериям aye IN ("10"), вероятно, часто появляются дважды (но с разными значениями рангов).

+0

Спасибо, я пытаюсь запустить его, пожалуйста, дайте мне мгновение ... – stack

+0

:-)! Этот запрос немного сложный, я его протестировал, и он имеет почти правильную сортировку, и это хорошо. Но продолжительность этого времени больше, чем мой первый запрос (три предложения 'select'). В любом случае, спасибо. +1 – stack

Смежные вопросы