Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Цикл на MySQL или что-то вроде этого

714
13 ноября 2011 года
clgs
226 / / 29.10.2008
Добрый день.
Подскажите как реализовать тоже самое но на MySQL, т.е. одним запросом.
Таблица data:
 
Код:
id | eid | type   | tid | oid | gid
1  | 1   | string | 1   | 1   | 1
2  | 1   | int    | 1   | 1   | 2


Таблица data_string:
 
Код:
id | value    | nid
1  | qwerty   | 1


Таблица data_int:
 
Код:
id | value | nid
1  | 123   | 2


 
Код:
$data=array();
$res=dbQuery('SELECT * FROM `data` WHERE `eid`=\'1\'');
while($row=$res->fetch_assoc()){
   $row2=dbSelect('SELECT * FROM `data_'.$row['type'].'` WHERE `id`=\''.$row['tid'].'\' LIMIt 1');
   $data[]=$row+$row2;
}
1
13 ноября 2011 года
kot_
7.3K / / 20.01.2000
можно ли сформулировать вопрос более внятно - что "тоже самое"?
274
13 ноября 2011 года
Lone Wolf
1.3K / / 26.11.2006
Поменять структуру БД. Зачем 2 таблицы? разграничивать типы данных в БД критично?
Так как я не знаю всей задачи судить не спешу, но. как помне тут хватит одной таблыцы со строковой записью value, а если там будет число, то пхп-шечка успешно интерпретирует его как число.
714
13 ноября 2011 года
clgs
226 / / 29.10.2008
Надо что-то вроде этого:
SELECT d.`type`,d.`oid`,d.`oig`,v.`oin`,v.`value` FROM `data` d
LEFT JOIN CONCAT('data_',d.`type`) v ON d.`еib`=v.`id`
WHERE d.`eid`='1'
274
13 ноября 2011 года
Lone Wolf
1.3K / / 26.11.2006
читать умеем? Чем продиктовано наличие ДВУХ таблиц? изменить струткур БД можно?
714
13 ноября 2011 года
clgs
226 / / 29.10.2008
Цитата: Lone Wolf
читать умеем? Чем продиктовано наличие ДВУХ таблиц? изменить струткур БД можно?


Был я в первом классе. Таблиц значительно больше. Изменить структуру невозможно.

714
13 ноября 2011 года
clgs
226 / / 29.10.2008
Цитата: Lone Wolf
как помне тут хватит одной таблыцы со строковой записью value, а если там будет число, то пхп-шечка успешно интерпретирует его как число.

А Вы пробовали делать выборку по такому полю: строк, целых и с плавающей точкой данные?

274
13 ноября 2011 года
Lone Wolf
1.3K / / 26.11.2006
Цитата: clgs
А Вы пробовали делать выборку по такому полю: строк, целых и с плавающей точкой данные?



а в чем проблема? В приведенном запросе, тип данного поля - побоку. Скажу больше, я не только делал выборку, но и видел продукты, которые в инете на каждом шагу, которые делают эту же выборку, в частности таблица натсроек, phpBB

И ваш запрос, даже если бы он мог работать, делает тоже самое, что делает одна таблица и тривиальный Join, только через жопу. Даже если допустить, что приведенный вами костяк запроса реализуем, то на выхлопе, и строковые и численые значение будут смешаны, и Вам прийдется каким-то различать их уже в скрипте.


А теперь уйдем от лирики, так как изменить структуру не в ваших силах, то делайте просто два Left join-а и вводите два поля для строкового и для численого значений параметров...

714
13 ноября 2011 года
clgs
226 / / 29.10.2008
Цитата: Lone Wolf
а в чем проблема? В приведенном запросе, тип данного поля - побоку. Скажу больше, я не только делал выборку, но и видел продукты, которые в инете на каждом шагу, которые делают эту же выборку, в частности таблица натсроек, phpBB


А вот теперь скажите, какой тип поля должен быть, если хранить в нем данные int,float,string,text ? И чтоб поиск по этому полю быстрый был.

Цитата: Lone Wolf
А теперь уйдем от лирики, так как изменить структуру не в ваших силах, то делайте просто два Left join-а и вводите два поля для строкового и для численого значений параметров...


Чуть выше мною написано, что таблиц более чем две. А делать вагон лефт жоинов это как раз через её самую)

277
13 ноября 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: clgs
А вот теперь скажите, какой тип поля должен быть, если хранить в нем данные int,float,string,text ?



благо пхп нетипизированный язык, поэтому тип поля может быть text.
//А вот с поиском хз

274
13 ноября 2011 года
Lone Wolf
1.3K / / 26.11.2006
что мешает сделать строковым это поле + создать на него индекс?
714
13 ноября 2011 года
clgs
226 / / 29.10.2008
Цитата: Lone Wolf
что мешает сделать строковым это поле + создать на него индекс?


MEDIUMTEXT + INDEX
1kk записей. Значения размером 1 до 100000 символов. И теперь давайте попробуем найти запись 100<x<10000 или "Hello". А про LIKE "%HELLO%" вообще молчу)
Собственно это и мешает, да и размер индекса.

274
13 ноября 2011 года
Lone Wolf
1.3K / / 26.11.2006
ну а что вы хотите? я вот понять не могу.. ту два варианта
1. одна таблица - легкий доступ, тяжелый поиск
2. куча таблиц - поиск проще, доступ геморный.

А сфинкс не вариант?
714
13 ноября 2011 года
clgs
226 / / 29.10.2008
Цитата: Lone Wolf
ну а что вы хотите? я вот понять не могу.. ту два варианта
1. одна таблица - легкий доступ, тяжелый поиск
2. куча таблиц - поиск проще, доступ геморный.

А сфинкс не вариант?



Ну я уже выбрал кучу таблиц. Изначальный вопрос был то в другом) [COLOR="silver"]Дайте пожалуйста ссылку на "сфинкс", если не сложно, а то не понял.[/COLOR]

P.S. Ссылку уже не надо, нашел.

274
13 ноября 2011 года
Lone Wolf
1.3K / / 26.11.2006
если уж выбрали вариант с кучей таблиц, sphinx вам не поможет. sphinxsearch.com/

Вобщем подитожем задачу, выборка всегда одного параметра? или может выбираться список?
Вы хотите на лету определять какую таблицу джоинить?
714
13 ноября 2011 года
clgs
226 / / 29.10.2008
Всегда один параметр. Для списков и т.д. уже в цикле серверного языка идет обработка.
Да, хочу в джоин (или любой другой быстрый вариант) подставлять называние таблицы из которой происходит выборка. Таблица 100% существует.
714
15 ноября 2011 года
clgs
226 / / 29.10.2008
Запрос получился такой. Скорость выполнения ~0.007-0.03 при 8к объектов и 200к свойств. К вечеру думаю набить таблицу до 1кк объектов и посмотрю какая будет скорость. Позже еще попробую сделать в виде процедуры чтоб лишних LEFT JOIN не было и посмотрю какая будет скорость по сравнению с текущем вариантом. Благо нашел как сделать запрос к таблице имя которой хранится в другой таблице.

Код:
SELECT
IF(d.`type`='string',t_string.oin_id,
IF(d.`type`='int',t_int.oin_id,
IF(d.`type`='text',t_text.oin_id,
IF(d.`type`='enum',t_enum.oin_id,
IF(d.`type`='float',t_float.oin_id,
IF(d.`type`='set',t_set.oin_id,
0)))))) AS oin_id,

t_float.value AS value_float,
t_string.value AS value_string,
t_int.value AS value_int,
t_text.value AS value_text,
t_enum.value AS value_enum,
t_set.value AS value_set,


d.* FROM `sites__obj_info_data` d
LEFT JOIN `sites__obj_info_data_string` t_string ON t_string.`id`=IF(d.`type`='string',d.`oid_id`,0)
LEFT JOIN `sites__obj_info_data_float` t_float ON t_float.`id`=IF(d.`type`='float',d.`oid_id`,0)
LEFT JOIN `sites__obj_info_data_int` t_int ON t_int.`id`=IF(d.`type`='int',d.`oid_id`,0)
LEFT JOIN `sites__obj_info_data_text` t_text ON t_text.`id`=IF(d.`type`='text',d.`oid_id`,0)
LEFT JOIN `sites__obj_info_data_enum` t_enum ON t_enum.`id`=IF(d.`type`='enum',d.`oid_id`,0)
LEFT JOIN `sites__obj_info_data_set` t_set ON t_set.`id`=IF(d.`type`='set',d.`oid_id`,0)
WHERE d.`eid`=7600
1
15 ноября 2011 года
kot_
7.3K / / 20.01.2000
а хранимые процедуры не спасут отца русской демократии? если уж нравится через ж... гланды рвать?
714
15 ноября 2011 года
clgs
226 / / 29.10.2008
Наверное спасают. Только я в этом не силен, изучаю, пробую, как получится буду использовать. А если есть желание и не затруднит, с удовольствием заюзал бы ваше решение =)
1
15 ноября 2011 года
kot_
7.3K / / 20.01.2000
Если не затрагивать и не обсуждать архитектуру - то это как раз таки та ситуация когда необходимо использовать SP.
http://www.zoonman.ru/library/mysql_sr_and_t.htm - описание например.
В этом случае можно использовать операторы ветвления и пр.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог