Ошибка MySQL при использовании count с другими запросами

0

Я использую jdbc для запуска этого запроса и успешного получения результатов в MySQL:

SELECT COUNT(DISTINCT xx.x, xx.z) as 'n_x|z', 
       COUNT(DISTINCT xx.w, xx.y, xx.z) as 'n_w|y|z' /*,...same COUNTS*/
       FROM (SELECT x0.field0 as 'x', x0.field1 as 'y', x0.field2 as 'z', 
       x0.field3 as 'w' FROM 'Kind' x0 ) as xx   

Следующий запрос также успешно генерирует результаты:

SELECT (1  * -1.5) as weight,
       xx.x, xx.y, xx.z, xx.w
/*The same table:*/
       FROM (SELECT x0.field0 as 'x', x0.field1 as 'y', x0.field2 as 'z', 
       x0.field3 as 'w' FROM 'Kind' x0 ) as xx   

Но комбинация:

SELECT COUNT(DISTINCT xx.x, xx.z) as 'n_x|z', 
       COUNT(DISTINCT xx.w, xx.y, xx.z) as 'n_w|y|z' /*,... same COUNTs*/
       ,(1  * -1.5) as weight,
       xx.x, xx.y, xx.z, xx.w
/*The same table:*/
       FROM (SELECT x0.field0 as 'x', x0.field1 as 'y', x0.field2 as 'z', 
       x0.field3 as 'w' FROM 'Kind' x0 ) as xx  

делает ошибку:

У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'xx.x, xx.y, xx.z, xx.w FROM (SELECT x0.field0 как x, x0.field1 как y, x0. fie 'в строке 1

Даже удаление ,(1 * -1.5) as weight не помогает! Я могу запускать два запроса отдельно, но я предпочитаю их комбинировать, чтобы таблица из сложного трудоемкого запроса:

FROM (SELECT x0.field0 as 'x', x0.field1 as 'y', x0.field2 as 'z', x0.field3 as 'w' FROM 'Kind' x0 ) as xx"

генерируется один раз. Что я делаю неправильно?

  • 0
    @scaisedge Я думаю, что вы могли случайно исправить проблему с синтаксисом в вашем редактировании.
  • 0
    @ P.Salmon .. Я использовал только фигурные тормоза и двойные кавычки. Для лучшего чтения ... чтобы вы могли получить доступ к исходному запросу в режиме редактирования. в любом случае, лучшее чтение вернулось
Показать ещё 2 комментария
Теги:
combinations
count

1 ответ

0
Лучший ответ

Будьте осторожны, у вас в первом запросе есть агрегирование по общей строке

во втором у вас есть строки без какой-либо агрегации

вы выбираете различное количество строк из двух запросов
поэтому вы должны или группировать для неагрегированной функции, например:

SELECT COUNT(DISTINCT xx.x, xx.z) as 'n_x|z', 
       COUNT(DISTINCT xx.w, xx.y, xx.z) as 'n_w|y|z'
       ,(1  * -1.5) as weight,
       xx.x, xx.y, xx.z, xx.w

       FROM (SELECT x0.field0 as 'x', x0.field1 as 'y', x0.field2 as 'z', 
       x0.field3 as 'w' FROM 'Kind' x0 ) as xx 
       group by  weight, xx.x, xx.y, xx.z, xx.w

или (в зависимости от ваших потребностей приложения) используйте функцию агрегации (например: min()) на не плоских рядах

SELECT COUNT(DISTINCT xx.x, xx.z) as 'n_x|z', 
       COUNT(DISTINCT xx.w, xx.y, xx.z) as 'n_w|y|z',
       min((1  * -1.5)) as weight,
       min(xx.x), 
       min(xx.y), 
       min(xx.z), 
       min(xx.w)

       FROM (SELECT x0.field0 as 'x', x0.field1 as 'y', x0.field2 as 'z', 
       x0.field3 as 'w' FROM 'Kind' x0 ) as xx 
       group by  weight, xx.x, xx.y, xx.z, xx.w

Или как в вашем последнем комментарии, если вы хотите повторить подсчет для всех строк формы xx, вы можете использовать CROSS JOIN

  SELECT c_xx.'n_x|z', c_xx.'n_w|y|z', 
         (1  * -1.5) as weight,
         xx1.x, xx1.y, xx1.z, xx1.w
  FROM (SELECT x0.field0 as 'x', x0.field1 as 'y', x0.field2 as 'z', 
         x0.field3 as 'w' FROM 'Kind' x0 ) xx1 

  CROSS JOIN (

      SELECT COUNT(DISTINCT xx.x, xx.z) as 'n_x|z', 
             COUNT(DISTINCT xx.w, xx.y, xx.z) as 'n_w|y|z' //,... same COUNTS
             FROM (SELECT x0.field0 as 'x', x0.field1 as 'y', x0.field2 as 'z', 
             x0.field3 as 'w' FROM 'Kind' x0 ) xx
  ) c_xx
  • 0
    Мне действительно нужно сделать то, что вы упомянули. Я хочу, чтобы в результате агрегации конечным результатом было 2 числа, и, кроме того, таблица из n строк с x, y, z, w в качестве столбцов. «GROUP BY» дает мне результат, но копируя одни и те же номера результатов в таблице n раз, что тратит пространство.
  • 0
    ответ дополнен предложением на основе вашего комментария
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню