Я использую 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"
генерируется один раз. Что я делаю неправильно?
Будьте осторожны, у вас в первом запросе есть агрегирование по общей строке
во втором у вас есть строки без какой-либо агрегации
вы выбираете различное количество строк из двух запросов
поэтому вы должны или группировать для неагрегированной функции, например:
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