Неправильное использование UNION и ORDER BY?
как я могу использовать union и порядок в mysql?
select * from _member_facebook inner join _member_pts ON _member_facebook._fb_owner=_member_pts._username where _member_facebook._promote_point = 9 ORDER BY RAND() limit 2 UNION ALL
select * from _member_facebook inner join _member_pts ON _member_facebook._fb_owner=_member_pts._username where _member_facebook._promote_point = 8 limit 3
сообщите мне об ошибке
#1221 - Incorrect usage of UNION and ORDER BY
любой может помочь?
Ответы
Ответ 1
Попробуйте:
(
select
*
from
_member_facebook
inner join
_member_pts
ON
_member_facebook._fb_owner=_member_pts._username
where
_member_facebook._promote_point = 9
ORDER BY RAND()
limit 2
)
UNION ALL
(
select
*
from
_member_facebook
inner join
_member_pts
ON
_member_facebook._fb_owner=_member_pts._username
where
_member_facebook._promote_point = 8
limit 3
)
Хотя, я думаю, вы должны поместить предложение ORDER BY
в конец второго запроса
Ответ 2
С круглыми скобками:
(
SELECT *
FROM _member_facebook
INNER JOIN _member_pts
ON _member_facebook._fb_owner =_member_pts._username
WHERE _MEMBER_FACEBOOK._PROMOTE_POINT = 9
ORDER BY RAND()
LIMIT 2
)
UNION ALL
(
SELECT *
FROM _MEMBER_FACEBOOK
INNER JOIN _MEMBER_PTS
ON _MEMBER_FACEBOOK._FB_OWNER =_MEMBER_PTS._USERNAME
WHERE _MEMBER_FACEBOOK._PROMOTE_POINT = 8
LIMIT 3
)
Сказано, что для MySQL не обязательно сохранять внутреннюю сортировку во внешнем разделе, хотя это, вероятно, так и будет, так как для сортировки строк необходимо отсортировать соответствующие предложения LIMIT
.
Ответ 3
Объяснение:
Важно понять, как это работает, чтобы избежать "gotchas" в подобных случаях использования. Обратите внимание, что синтаксис union
несколько "особенный":
subsatementunion all
subsatementunion all
subsatement [order by
-clause] [ limit
-clause]
где "подкрепление" может быть дополнительно окружено (
и )
. Некоторые рабочие примеры:
Тем не менее, если вы окружаете первое "подкрепление" фигурными скобками, вы должны окружать все остальные "подстанции" с помощью фигурных скобок:
(Обратите внимание, что вышеуказанная точка не упоминается в официальных документах .)
Несоблюдение этого является синтаксической ошибкой:
Затем каждое "подсечение" может содержать where
, group by
, having
, join
, limit
, но не order by
.
Если вы хотите использовать order by
, "субтитент", содержащий order by
, должен быть окружен фигурными скобками. (Это означает, что они больше не являются необязательными.)
Теперь, если мы снова посмотрим на синтаксис:
subsatementunion all
subsatementunion all
subsatement [order by
-clause] [ limit
-clause]
мы видим, что весь оператор union
заканчивается необязательным order by
/limit
. Эти два ключевых слова относятся ко всему выражению union
, а не только к последнему "подтеке":
Ранее мы упоминали, что ключевое слово limit
также может быть применено к отдельным "подпанелям" s:
Если вы хотите применить limit
к последнему "подтему" (в отличие от всего оператора union
), вы должны окружить последнее "подзаголовок" фигурными скобками:
Чтобы применить limit
к последнему "подтему" , а также ко всему оператору union
, используйте:
То же самое с order by
:
Но обратите внимание, что применение order by
к "subatement" s бессмысленно, потому что в документах явно указано указано, что order by
гарантируется (cf.) для работы во всем заявлении union
:
& puncsp; – & sect; – & ensp;..use order by
для отдельных операторов SELECT
ничего не говорит о порядке, в котором строки появляются в конечном результате.
Единственный способ order by
иметь смысл в "подтеке" - это объединить его с limit
:
& puncsp; – & sect; – & ensp;.. использование ORDER BY в этом контексте обычно связано с limit
, так что оно используется для определения подмножества выбранных строк для извлечения для SELECT
, даже если оно не обязательно влияют на порядок этих строк в конечном результате union
.
Кроме того, если вы хотите объединить select into
с union
, будет больше "gotchas", чтобы следить за, См. вопрос 32858 относительно этого.
Ответ 4
Правильно:
(SELECT *
FROM _member_facebook
INNER JOIN _member_pts ON _member_facebook._fb_owner=_member_pts._username
WHERE _member_facebook._promote_point = 9 LIMIT 2)
UNION ALL
(SELECT *
FROM _member_facebook
INNER JOIN _member_pts ON _member_facebook._fb_owner=_member_pts._username
WHERE _member_facebook._promote_point = 8 LIMIT 3)
ORDER BY 1