Неправильное использование UNION и ORDER BY? - программирование
Подтвердить что ты не робот

Неправильное использование 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

любой может помочь?

4b9b3361

Ответ 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]

где "подкрепление" может быть дополнительно окружено ( и ). Некоторые рабочие примеры:

  • select 1 union all (select 2);
    select 1 union all  select 2  union all (select 3);
    select 1 union all (select 2) union all  select 3;
    select 1 union all (select 2) union all (select 3);
    select 1 union all (select 2) union all (select 3) union all  select 4;
    select 1 union all (select 2) union all  select 3  union all (select 4);
    

Тем не менее, если вы окружаете первое "подкрепление" фигурными скобками, вы должны окружать все остальные "подстанции" с помощью фигурных скобок:

  • (select 1) union all (select 2) union all (select 3);
    

(Обратите внимание, что вышеуказанная точка не упоминается в официальных документах .)

Несоблюдение этого является синтаксической ошибкой:

  • mysql> (select 1) union all select 2; -- error because not all "substatement"s are braced
    ERROR 1064 (42000): You have an error in your SQL syntax; check the...
    mysql> (select 1) union all (select 2) union all  select 3; -- error because not all "substatement"s are braced
    ERROR 1064 (42000): You have an error...
    mysql> (select 1) union all  select 2  union all (select 3); -- error because not all "substatement"s are braced
    ERROR 1064 (42000): You have an error...
    

Затем каждое "подсечение" может содержать 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, а не только к последнему "подтеке":

  • mysql> select 1
        -> union all
        -> select 2 limit 1;
    +---+
    | 1 |
    +---+
    | 1 |
    +---+
    1 row in set (0.00 sec)
    
    mysql>
    

Ранее мы упоминали, что ключевое слово limit также может быть применено к отдельным "подпанелям" s:

  • mysql> select 1 limit 1
        -> union all
        -> select 2;
    +---+
    | 1 |
    +---+
    | 1 |
    | 2 |
    +---+
    2 rows in set (0.00 sec)
    
    mysql>
    

Если вы хотите применить limit к последнему "подтему" ​​(в отличие от всего оператора union), вы должны окружить последнее "подзаголовок" фигурными скобками:

  • mysql> select 1
        -> union all
        -> (select 2 limit 1);
    +---+
    | 1 |
    +---+
    | 1 |
    | 2 |
    +---+
    2 rows in set (0.00 sec)
    
    mysql>
    

Чтобы применить limit к последнему "подтему" ​​, а также ко всему оператору union, используйте:

  • mysql> select 1
        -> union all
        -> (select 2 limit 1)limit 1;
    +---+
    | 1 |
    +---+
    | 1 |
    +---+
    1 row in set (0.00 sec)
    
    mysql>
    

То же самое с order by:

  • mysql> select 1
        -> union all
        -> (select 2 order by 1)order by 1;
    +---+
    | 1 |
    +---+
    | 1 |
    | 2 |
    +---+
    2 rows in set (0.00 sec)
    
    mysql>
    

Но обратите внимание, что применение 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