Запрос к mysql. Гуру, помогите!

12
arsenk
На сайте с 25.09.2007
Offline
141
1289

Не силен в синтаксисе запросов к этой субд, у меня такой вопрос, есть элементарная таблица с товарами с полями id, name, description, createdate .... parameters

Так вот, в поле parameters как раз самое интересное. Это поле содержит текстовую запись вида:

{"color":"red", "height":"545", "length":"110"} в общем, json

Возможно ли задать запрос в базу так, чтобы выбрать все товары, у которых высота (height) будет между 400 и 600 ?

Как вообще можно реализовать такую задачу?

Заранее спасибо!

Человека больше убеждают утверждения, до которых он додумался сам, чем те, до которых додумались другие
ParserYa
На сайте с 04.10.2010
Offline
29
#1

Нет.. отказывайтесь от джейсона, если надо выборку проводить по параметрам..

ДП
На сайте с 23.11.2009
Offline
190
#2

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

M
На сайте с 27.10.2006
Offline
111
#3

Я бы не парился и сделал бы дерзко.

Вытащил бы все id и parameters, декодировал JSON, присоединил id к массиву и искал в массиве. С полученными id опять лез бы в базу.

Бесплатное хранилище данных (http://bit.ly/gJYy9Z) (5GB) с синхронизацией. По ссылке — бонус 500MB.
CB
На сайте с 19.11.2009
Offline
28
#4
Возможно ли задать запрос в базу так, чтобы выбрать все товары, у которых высота (height) будет между 400 и 600 ?

По рукам и губам нужно бить даже за одну мысль о реализации подобного...Бить больно и сильно, пока глупая голова "прАмгрАМиста" не вернётся на землю и перестанет придумывать всякую чепуху.

L
На сайте с 07.12.2007
Offline
351
#5
arsenk:
в поле parameters как раз самое интересное. Это поле содержит текстовую запись вида:
{"color":"red", "height":"545", "length":"110"} в общем, json

Возможно ли задать запрос в базу так, чтобы выбрать все товары, у которых высота (height) будет между 400 и 600 ?

Можно ссорудить конструкцию типа такой:

SELECT * FROM `имя_таблицы` WHERE parameters LIKE '%"height":"4__",%' OR parameters LIKE '%"height":"5__",%' OR parameters LIKE '%"height":"6__",%', выгребет от 400 до 600 включительно.

В более сложных случаях придётся выгребать все записи и отсеивать регуляркой на PHP.

arsenk
На сайте с 25.09.2007
Offline
141
#6
CyBase:
По рукам и губам нужно бить даже за одну мысль о реализации подобного...Бить больно и сильно, пока глупая голова "прАмгрАМиста" не вернётся на землю и перестанет придумывать всякую чепуху.

Даже комментировать не буду...

Мысль идет не о реализации, а о том, что это УЖЕ реализовано, и теперь надо доработать так, чтобы можно было бы не вытягивать все из базы, а потом обрабатывать массивом, а как-то "умнее". Иначе, прийдется уже тогда вытягивать все.

ParserYa:
Нет.. отказывайтесь от джейсона, если надо выборку проводить по параметрам..

Дело не в json. Даже, если бы поле содержало бы запись "color=red, height=545, length=110" то история была бы, думаю, той же..

Maxoud:
Я бы не парился и сделал бы дерзко.
Вытащил бы все id и parameters, декодировал JSON, присоединил id к массиву и искал в массиве. С полученными id опять лез бы в базу.

Можно, но это решение "в лоб". Представьте, что записей (товаров) в таблице 100000. При каждом обращении будет в оперативе образовываться такая громадина?..

И вместо массива, скажем, из 10-15-20 товаров я буду КАЖДЫЙ раз получать и обрабатывать массив из ста тысяч. А вообще, насколько сильно такая реализация будет грузить сервак? Может, я преувеличиваю?

Ladycharm:
Можно ссорудить конструкцию типа такой:
SELECT * FROM `имя_таблицы` WHERE parameters LIKE '%"height":"4__",%' OR parameters LIKE '%"height":"5__",%' OR parameters LIKE '%"height":"6__",%', выгребет от 400 до 600 включительно.

В более сложных случаях придётся выгребать все записи и отсеивать регуляркой на PHP.

Спасибо за идею. Надо об этом подумать. Пока самый вразумительный ответ.

В общем, как я понял в mysql нет такого синтаксиса, чтобы на лету выбрал из базы так, как я хочу. Надо извращаться только подобным образом?

L
На сайте с 22.06.2008
Offline
44
#7
В общем, как я понял в mysql нет такого синтаксиса, чтобы на лету выбрал из базы так, как я хочу. Надо извращаться только подобным образом?

ИМХО Вы не используете базу данных как реляционную базу. Все в sql есть но sql это structure query language а не способ хранить данные не в файлах. Подредактируйте структуру базы и будет вам счастье.

Лучше создать несколько дополнительных полей, написать скрипт чтобы разбить атрибуты нормально и пользоваться стандартным SQL Between. Если это нормальный проект.

L
На сайте с 07.12.2007
Offline
351
#8
arsenk:
В общем, как я понял в mysql нет такого синтаксиса, чтобы на лету выбрал из базы так, как я хочу. Надо извращаться только подобным образом?

Форма представления данных (в БД MySQL) сильно влияет на способы из обработки.

Этим и вызвана некоторая резкость поста CyBase - классические программисты, они мыслят сразу объектно-ориентированно :)

Оператор LIKE ищет не точно, а по шаблону, _ - означает один любой символ, % - любое количество сиволов.

Практически - это шаблон по регулярному выражению.

А "долбать" джонсон-а Мускул не умеет.

У него есть встроенные строковые функции типа SUBSTRING() и тп, можно написать и свои функции, которые будут парсить json.

Но вот будет ли это быстро работать...

arsenk
На сайте с 25.09.2007
Offline
141
#9
Ladycharm:
Форма представления данных (в БД MySQL) сильно влияет на способы из обработки.
Этим и вызвана некоторая резкость поста CyBase - классические программисты, они мыслят сразу объектно-ориентированно :)

Оператор LIKE ищет не точно, а по шаблону, _ - означает один любой символ, % - любое количество сиволов.

Практически - это шаблон по регулярному выражению.

А "долбать" джонсон-а Мускул не умеет.
У него есть встроенные строковые функции типа SUBSTRING() и тп, можно написать и свои функции, которые будут парсить json.
Но вот будет ли это быстро работать...

Большое спасибо за содержательный ответ. Теперь буду активно думать по этому вопросу.

Остается только единственный вопрос. Если, все-таки, сгребать всю базу из, скажем, 10 - 20 тыс. записей, потом циклом перебирать и выводить уже с помощью php то, что мне надо, будет ли это грузить сервак сильно или терпеть можно?

ПС: хотя, если изучить регулярки (http://www.mysql.ru/docs/man/Regexp.html) и функции (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring), то, думаю, можно что-то слепить

AS
На сайте с 11.10.2010
Offline
45
#10

А не думали над вариантом переделать структуру базы?

Лучше один раз переделать, чем потом всю жизнь мучиться с записями вида: "{"color":"red", "height":"545", "length":"110"}"

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий