Получение ошибки «Обнаружено нечисловое значение» при использовании скобок с LIMIT в инструкциях SELECT - PullRequest
0 голосов
/ 21 июня 2019

ПОЖАЛУЙСТА, СМОТРИТЕ ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ ВНУТРИ


У меня следующий запрос с использованием MySQL в phpMyAdmin:

(SELECT 
  id, 
  name, 
  rank1, 
  rank2 
FROM rank_list 
LEFT JOIN names ON names.id = rank_list.name_id 
WHERE type = "typeA" 
ORDER BY rank1
LIMIT 50) 

UNION ALL

(SELECT 
  id, 
  name, 
  rank1, 
  rank2 
FROM rank_list 
LEFT JOIN names ON names.id = rank_list.name_id 
WHERE type = "typeB" 
ORDER BY rank2 
LIMIT 50)

  • Что этоделает, чтобы получить верхние 50 рангов для rank1 из typeA и объединить его с верхними 50 рангами для rank2 из typeB.
  • Мне нужно использовать круглые скобки вокруг каждой суб SELECT, потому чтоЯ применяю операторы LIMIT и ORDER BY к обоим.
  • Оба по отдельности работают нормально.

ПРОБЛЕМА

Яполучая следующую ошибку при применении UNION к обоим запросам:

A non-numeric value encountered

Я действительно не понимаю это здесь ... Одна вещь, которая может вызвать это, это то, что я заполняюrank1 столбец -1, если type = "typeB" (то же самое для rank2 и type = "typeA".

Или здесь что-то еще?

РЕДАКТИРОВАТЬ:

Это работает, когда я не применяю LIMIT к нему

РЕДАКТИРОВАТЬ 2

Я понял, что при выполнении следующих действий (используяскобки) я тоже получаю такую ​​же ошибку:

(SELECT id FROM rank_list LIMIT 1)

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Я не могу воспроизвести вашу проблему

drop table if exists rank_list,names;
create table rank_list
(id int,name_id int,rank1 int,rank2 int,type varchar(10));
create table names
(id int, name varchar(3));

insert into rank_list values
(1,1,1,1,'typea'),(2,2,3,1,'typea'),
(2,2,1,1,'typeb');

insert into names values
(1,'aaa'),(2,'bbb');

(SELECT 
  rank_list.id, 
  name, 
  rank1, 
  rank2 
FROM rank_list 
LEFT JOIN names ON names.id = rank_list.name_id 
WHERE type = "typeA" 
ORDER BY rank1 desc
LIMIT 50) 

UNION ALL

(SELECT 
  rank_list.id, 
  name, 
  rank1, 
  rank2 
FROM rank_list 
LEFT JOIN names ON names.id = rank_list.name_id 
WHERE type = "typeB" 
ORDER BY rank2 desc
LIMIT 50);

+------+------+-------+-------+
| id   | name | rank1 | rank2 |
+------+------+-------+-------+
|    2 | bbb  |     3 |     1 |
|    1 | aaa  |     1 |     1 |
|    2 | bbb  |     1 |     1 |
+------+------+-------+-------+
3 rows in set (0.00 sec)

Примечание. У меня полностью идентифицированный идентификатор. Если ваша модель отличается, то без дополнительного ответа от вас любой ответ или комментарий будет угадан.

0 голосов
/ 21 июня 2019

попробуйте применить тип данных, используя приведение

  (SELECT 
    id, 
    name, 
    cast(rank1 AS SIGNED ), 
    cast(rank2  AS SIGNED )
  FROM rank_list 
  LEFT JOIN names ON names.id = rank_list.name_id 
  WHERE type = "typeA" 
  ORDER BY rank1
  LIMIT 50) 

  UNION ALL

  (SELECT 
    id, 
    name, 
    cast(rank1 AS SIGNED ), 
    cast(rank2  AS SIGNED )
  FROM rank_list 
  LEFT JOIN names ON names.id = rank_list.name_id 
  WHERE type = "typeB" 
  ORDER BY rank2 
  LIMIT 50)
...