Цикл на MySQL или что-то вроде этого
Подскажите как реализовать тоже самое но на MySQL, т.е. одним запросом.
Таблица data:
1 | 1 | string | 1 | 1 | 1
2 | 1 | int | 1 | 1 | 2
Таблица data_string:
1 | qwerty | 1
Таблица data_int:
1 | 123 | 2
$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;
}
Так как я не знаю всей задачи судить не спешу, но. как помне тут хватит одной таблыцы со строковой записью value, а если там будет число, то пхп-шечка успешно интерпретирует его как число.
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'
Был я в первом классе. Таблиц значительно больше. Изменить структуру невозможно.
А Вы пробовали делать выборку по такому полю: строк, целых и с плавающей точкой данные?
а в чем проблема? В приведенном запросе, тип данного поля - побоку. Скажу больше, я не только делал выборку, но и видел продукты, которые в инете на каждом шагу, которые делают эту же выборку, в частности таблица натсроек, phpBB
И ваш запрос, даже если бы он мог работать, делает тоже самое, что делает одна таблица и тривиальный Join, только через жопу. Даже если допустить, что приведенный вами костяк запроса реализуем, то на выхлопе, и строковые и численые значение будут смешаны, и Вам прийдется каким-то различать их уже в скрипте.
А теперь уйдем от лирики, так как изменить структуру не в ваших силах, то делайте просто два Left join-а и вводите два поля для строкового и для численого значений параметров...
А вот теперь скажите, какой тип поля должен быть, если хранить в нем данные int,float,string,text ? И чтоб поиск по этому полю быстрый был.
Чуть выше мною написано, что таблиц более чем две. А делать вагон лефт жоинов это как раз через её самую)
благо пхп нетипизированный язык, поэтому тип поля может быть text.
//А вот с поиском хз
MEDIUMTEXT + INDEX
1kk записей. Значения размером 1 до 100000 символов. И теперь давайте попробуем найти запись 100<x<10000 или "Hello". А про LIKE "%HELLO%" вообще молчу)
Собственно это и мешает, да и размер индекса.
1. одна таблица - легкий доступ, тяжелый поиск
2. куча таблиц - поиск проще, доступ геморный.
А сфинкс не вариант?
1. одна таблица - легкий доступ, тяжелый поиск
2. куча таблиц - поиск проще, доступ геморный.
А сфинкс не вариант?
Ну я уже выбрал кучу таблиц. Изначальный вопрос был то в другом) [COLOR="silver"]Дайте пожалуйста ссылку на "сфинкс", если не сложно, а то не понял.[/COLOR]
P.S. Ссылку уже не надо, нашел.
Вобщем подитожем задачу, выборка всегда одного параметра? или может выбираться список?
Вы хотите на лету определять какую таблицу джоинить?
Да, хочу в джоин (или любой другой быстрый вариант) подставлять называние таблицы из которой происходит выборка. Таблица 100% существует.
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
http://www.zoonman.ru/library/mysql_sr_and_t.htm - описание например.
В этом случае можно использовать операторы ветвления и пр.