2014-12-16 2 views
2

У меня есть приложение, которое я написал в JavaScript/HTML, который использует базу данных локального компьютера. Это довольно сложная проблема, но мне просто нужна помощь в SQL-запросе прямо сейчас. Более подробную информацию о локальном классе базы данных JavaScript можно найти здесь: JavaScript Access database classПреобразование SQL-запросов из Access в MySQL

Данные состоят из трехмерных значений и компонента времени, поэтому база данных довольно большая, хотя я упростил данные с 200 временных шагов до 3 для тестирования. Существует несколько значений, описывающих трехмерную модель, поэтому я получаю доступ к различным значениям с помощью выпадающих списков. К сожалению, у меня нет рабочей версии, которую я могу показать всем, потому что она работает только на локальной машине. Я пытаюсь преобразовать эту версию в демонстрацию базы данных, основанной на веб-стиле, которая запускает MySQL. Я размещаю в FatCow, и если вы знаете их, вы знаете, что у них есть PHP-интерфейс MySQL.

Настройка данных

Способ данные настройки, у меня есть несколько столбцов, которые описывают таблицы данных 3D описана ниже. Это для одной таблицы под названием «Даты»:

  • Cell (уникальный номер для этой ячейки в матрице)
  • XVal (это X место СИНКА матрицы)
  • YVal (это Y расположение в матрице)
  • подъема (Это местоположение Z в матрице)
  • окт-97 (это один из трех компонентов времени со значениями)
  • окт-07 (это один из трех раз компоненты со значениями)
  • октября-17 (это один из трех временных компонент со значениями)

Есть несколько таблиц, которые называются, чтобы сделать сетку, но давайте просто сосредоточиться на «Даты» таблиц сейчас

Некоторые таблицы данных настраиваются аналогично ссылкам XVal и YVal, но некоторые относятся только к уникальному значению Cell. В текущем приложении я беру большие столбцы данных и делаю таблицу сводных преобразований для создания сетки модели. Трехмерная матричная сетка 36x41x15. Эти сетки отображаются в виде:

  • XY вид сверху
  • поперечное XZ сечение
  • крест YZ раздел

У меня есть три запроса SQL для каждой из сетей, которые работают в моем местном применении, но они не работают в MySQL. Имейте в виду, я учу себя, как делать это, поэтому я немного неопытен. Не убивайте меня, если это очевидная ошибка.

SQL-запросы, которые работают на местном применении

Для этих трех запросов, вот что работает:

  • XY сетка: TRANSFORM ROUND(max(dat.[Oct-07]) *100,2) SELECT dat.Yval FROM dat WHERE (((dat.Lift)=7)) GROUP BY dat.Yval ORDER BY dat.Yval DESC , dat.Xval PIVOT dat.Xval;

  • XZ сетка: TRANSFORM ROUND(max(dat.[Oct-07]) *100,2) SELECT dat.Lift FROM dat WHERE (((dat.Yval)=20)) GROUP BY dat.Lift, dat.Yval ORDER BY dat.Lift DESC PIVOT dat.Xval;

  • YZgrid: TRANSFORM ROUND(max(dat.[Oct-07]) *100,2) SELECT dat.Lift FROM dat WHERE (((dat.Xval)=20)) GROUP BY dat.Lift ORDER BY dat.Lift DESC , dat.Yval DESC PIVOT dat.Yval;

Приложение обращается к XVal, YVal или Lift, которое необходимо для отображения. Таким образом, в сетке XY [Oct-07] является переменной в запросе, как и dat.Lift (число от 1 до 15).

Аналогично в двух других сетках, [Oct-07] - это переменная в запросе, как и dat.YVal или dat.XVal соответственно.

После того как я импортировал данные в MySQL Я попытался запустить эти запросы, но они дают ошибку:

MySQL said: Documentation 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRANSFORM ROUND(max(dat . [ Oct - 07 ]) * 100 , 2) SELECT dat . Yval FROM da' at line 1 

Я использую ROUND (MAX (... чтобы вернуть все значения столбца и исправить десятичное .

Я думаю, что проблема в ТРАНСФОРМ заявлении, но я не знаю, как перевести это и получить тот же результат.

вопрос заключается в том, как я могу перевести эти три запроса из MS Access основанный на MySQL запрос?

Спасибо за помощь и понимание

+2

Нет конвертации. У mysql нет поддержки для сводных запросов, кроме отвратительных хаков для определенных наборов колонок. и эти хаки становятся чрезвычайно уродливыми, очень быстро –

+0

Любые предложения о том, что я могу сделать для достижения того, что мне нужно? – Crimpy

+0

выполните стандартный запрос в mysql, затем выполните преобразование сводных данных в клиентском коде. –

ответ

1

Там нет в MySQL нет TRANSFORM. TRANSFORM действительно просто псевдоним, поэтому MS Access выполнит работу для вас при создании запросов «кросс-табу», и вы можете использовать меньше кода. Вместо этого используйте ANSI SQL-путь.

http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=25

Пример ANSI кросс вкладке SQL запроса:

Example ANSI-SQL Crosstab 

SELECT 
    SUM(CASE WHEN purchase_date BETWEEN '2004-08-01' and '2004-08-31' THEN amount ELSE 0 END) As m2004_08, 
    SUM(CASE WHEN purchase_date BETWEEN '2004-09-01' and '2004-09-30' THEN amount ELSE 0 END) As m2004_09, 
    SUM(CASE WHEN purchase_date BETWEEN '2004-10-01' and '2004-10-31' THEN amount ELSE 0 END) As m2004_10, 
SUM(amount) As Total 
FROM purchases WHERE purchase_date BETWEEN '2004-08-01' AND '2004-10-31' 

Вы, вероятно, нужно использовать GROUP_CONCAT и было бы проще, если вы можете использовать stored procedures

Вот краткое руководство при создании кросс-таблицы запроса в MySQL: http://www.databasejournal.com/features/mysql/article.php/3855376/All-About-the-Crosstab-Query.htm

+0

Одна вещь, которая ставит мою проблему из примеров, заключается в том, что эти примеры, которые вы дали (и другие, которые я видел), подсчитывают количество вхождений. Мне нужны фактические значения для прохождения. Как я могу это сделать? – Crimpy

+0

@Crimpy вам нужно поместить значение в переменную и использовать функции mysql math http://dev.mysql.com/doc/refman/5.0/en/arithmetic-functions.html –

Смежные вопросы