|
|
|
| Таблица содержит координаты точек в многомерном пространстве.
Примерно вот так выглядит (с сокращениями)
CREATE TABLE
INT num PRIMARY_KEY,
INT pointNum,
INT axeNum,
double coordinateValue
|
У меня есть значение для всех координат некой точки.
Я хочу узнать, есть эта точка в таблице или нет?
Вроде бы должно быть просто, но я не могу придумать запроса. | |
|
|
|
|
|
|
|
для: Eugene77
(29.03.2012 в 06:49)
| | А как координаты задаются в старшем и младшем разряде coordinateValue? Или как-то по другому? | |
|
|
|
|
|
|
|
для: cheops
(29.03.2012 в 14:24)
| | >А как координаты задаются в старшем и младшем разряде coordinateValue? Или как-то по другому?
Не,
Координата - это всё число.
Оно относится к тому номеру оси axeNum с которым стоит в одной строке.
Такой формат хранения координат выбран потому что таблица должна хранить данные для пространств с разной размерностью | |
|
|
|
|
|
|
|
для: Eugene77
(30.03.2012 в 10:16)
| | А... пространство многомерное, но координаты прямоугольные декартовы? Размерность пространства заранее не известна? | |
|
|
|
|
|
|
|
для: cheops
(30.03.2012 в 13:08)
| | >А... пространство многомерное, но координаты прямоугольные декартовы? Размерность пространства заранее не известна?
Насчёт декартовости координат, трудно сказать, да и не имеет это отношения к вопросу.
Но размерность, действительно, заранее неизвестна.
Известно только, что она находится в пределах от 100 до 1000.
Кроме того, в таблице должны храниться точки из пространств разной размерности.
Этих пространств много, десятки, на каждое новую таблицу не получится сделать. | |
|
|
|
|
|
|
|
для: Eugene77
(31.03.2012 в 07:24)
| | А в какой форме у вас
>У меня есть значение для всех координат некой точки.
Это массив или что? pointNum - это уникальный номер точки или за это отвечает num? | |
|
|
|
|
|
|
|
для: cheops
(31.03.2012 в 14:13)
| | CREATE TABLE
INT num PRIMARY_KEY, - первичный ключ - смысла не имеет
INT pointNum, - номер точки (уникальный номер в другой таблице, к которой данная таблица присоединяется через этот внешний ключ, а в упомянутой родительской таблице - это первичный ключ)
INT axeNum, - номер оси (координатной)
double coordinateValue - значение координаты для данной оси (axeNum) и данной точки (pointNum) | |
|
|
|
|
|
|
|
для: Eugene77
(29.03.2012 в 06:49)
| | Не уверен, но можно начать с такого запроса
SELECT
pointNum,
COUNT(pointNum) AS total
FROM
tbl
WHERE
(axeNum = 1 AND
coordinateValue >= 0.3234 - 0.0001 AND
coordinateValue <= 0.3234 + 0.0001) OR
...
(axeNum = 256 AND
coordinateValue >= 0.5435 - 0.0001 AND
coordinateValue <= 0.5435 + 0.0001)
GROUP BY
pointNum
HAVING
total = 256
| Т.е. смысл в том, чтобы найти такую точку (здесь в 256-мерном пространстве), для которой будет найдено все 256 соответствий. | |
|
|
|
|
|
|
|
для: cheops
(01.04.2012 в 13:19)
| | >Не уверен, но можно начать с такого запроса
Спасибо!
Видимо, ничего лучше не придумать.
Вот этой части я пытался избежать, нормализуя числа паред записью в таблицу:
>
axeNum = 1 AND
> coordinateValue >= 0.3234 - 0.0001 AND
> coordinateValue <= 0.3234 + 0.0001) OR
|
Как вы думаете, если перед записью числа нормализованы
При помощи округления и отбрасывания лишних нулей,
в запросе тоже нормализованы,
можно оставить только равенства?
>
axeNum = 1 AND
> coordinateValue = 0.3234 OR
|
Или MySQL, делая свои преобразования нарушит нормализацию? | |
|
|
|
|
|
|
|
для: Eugene77
(03.04.2012 в 07:04)
| | Можно, но лучше, если бы у вас вместо double был DECIMAL. | |
|
|
|
|
|
|
|
для: cheops
(03.04.2012 в 12:32)
| | >Можно, но лучше, если бы у вас вместо double был DECIMAL.
Спасибо!
Так и сделаю | |
|
|
|