длинный запрос - ошибка

wanderer

PHP - rulez!...
длинный запрос - ошибка

у меня есть форма. там я задая критерии поиска. так вот когда я решил протестировать и задал все критерии получился такой вот запрос:
PHP:
SELECT * FROM site_virtual_plans WHERE 1=1
AND plan_name='dgdg'
AND plan_month_fees<=10
AND plan_one_fees<=5
AND plan_os='FreeBSD'
AND plan_server_software='Apache'
AND plan_mail_boxes=>4
AND plan_disk_size=>50
AND plan_traffic=>1
....
на что мне в ответ ошибка, хотя если я задаю поиск по меньшему кол-ву критериев, то всё нормально.

текст ошибки:
Error 1064: You have an error in your SQL syntax near '=>4 AND plan_disk_size=>50 AND plan_traffic=>1 AND plan_sub_domains=>5 AND plan_' at line 1

вопрос: есть ли критерий на длинну запроса/кол-во условий ?
 

Yurik

/dev/null
Так, не к вопросу, но в тему

А не лучше сделать такую БД. Можно легко добавлять фичи планов. И ьаблица не будет расти вширь, и скрипты будут универсальнее

user
-----
id
name
contact


plans
--------
iduser
idfeature
value

features
--------
id
description
 

wanderer

PHP - rulez!...
FreeSpace: спасибо, сейчас только что увидел! млин. на такую вещь не сразу обратишь внимание. :( вот руки то кривые у меня. как я так написал - сам не знаю :( и ещё на форум полез мля. эх. обидно даже.

Yurik: интересное предложение. спасибо тебе.

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

wanderer

PHP - rulez!...
вот думаю сейчас над предложением Yurik'а.

получается вот такие таблицы:
site_user
user_id - varchar
user_name - varchar
......

site_users_plans
user_id - varchar
plan_id - varchar
plan_type - int
plan_name - varchar
......

site_users_plans_features
plan_id - varchar
feature_name - varchar
feature_value - varchar

вот. в таблице site_users_plans_features будут записи "фич":
Код:
[b]plan_id[/b]    [b]feature_name[/b]             [b]feature_value[/b]
gdsgsgdsg        plan_month_fees                  10
gdsgsgdsg        plan_os                                  Linux
gdsgsgdsg        .....                                         .....
fjhkjdfhjkhi        plan_month_fees                  20
fjhkjdfhjkhi        plan_os                                  FreeBSD
fjhkjdfhjkhi        .....                                         .....
так вот вопрос: как осуществить поиск по таблице site_users_plans с фичами из таблицы site_users_plans_features, тоесть хотелось бы чтобы работало что-то вроде такого:
[sql]
SELECT * FROM site_users_plans LEFT JOIN site_users_plans_features ON (site_users_plans.plan_id=site_users_plans_features.plan_id) WHERE site_users_plans_features.feature_name='plan_os' AND site_users_plans_features.feature_value='FreeBSD' AND
site_users_plans_features.feature_name='plan_monts_fees' AND
site_users_plans_features.feature_name='20'
[/sql]
и я получал запись из таблицы site_users_plans по плану с ид fjhkjdfhjkhi и все записи фич из таблицы site_users_plans_features

вот. надеюсь я ясно изъяснился.
 

Yurik

/dev/null
Ну дык все правильно сделал, только благаю тебе, поставь
для всех
*_id вместо типа varchar -> UNSIGNED INT (MEDIUMINT), ну и индексы не забудь (PRIMARY KEY) и auto_increment
а то изврат джойнить по варчару
 

wanderer

PHP - rulez!...
у меня ид md5(microtime()) - может это и изврат, но так сделал.
тоесть получается этот запрос будет работать?... хм... надо будет попробовать...
 

Yurik

/dev/null
точно изврат, кроме растраты ресурсов (32 байта вместо 4 на данных + на индексе) и проблем ничего не дает
 

wanderer

PHP - rulez!...
хм... не проходит такая структура при поиске:
во-первых так как feature_value имеет тип varchar, то нельзя писать что-то вроде feature_value<='10'
во-вторых можно искать только по одной "фичи":
при запросе
[sql]SELECT * FROM site_users_plans LEFT JOIN site_users_plans_features ON site_users_plans.plan_id = site_users_plans_features.plan_id[/sql]
записи будут "выдаваться" так:
Код:
gdsgsgdsg        plan_month_fees                  10
gdsgsgdsg        plan_os                                  Linux
gdsgsgdsg        .....                                         .....
fjhkjdfhjkhi        plan_month_fees                  20
fjhkjdfhjkhi        plan_os                                  FreeBSD
fjhkjdfhjkhi        .....                                         .....
 

wanderer

PHP - rulez!...
сделай два поля, одно для числовых фич, другое для строчных
об этом я уже тоже подумал :) когда спать лёг.
WHERE expr1 OR expr2 OR expr3
вот этого я не понял. чты ты имел ввиду?
типа: [sql]WHERE (site_users_plans_features.feature_name = 'plan_os' AND site_users_plans_features.feature_value = 'FreeBSD') OR (site_users_plans_features.feature_name = 'plan_monts_fees' AND site_users_plans_features.feature_name = '20')[/sql]
но мне нужно чтобы была логика AND.
 

Yurik

/dev/null
Сравни и догадайся сам:

user
-----
id
name
contact

plans
--------
iduser
idfeature
value

features
--------
id
description

=================================
site_user
user_id - varchar
user_name - varchar
......

site_users_plans
user_id - varchar
plan_id - varchar
plan_type - int
plan_name - varchar

site_users_plans_features
plan_id - varchar
feature_name - varchar
feature_value - varchar

Hint: Не в фичи заносится план, а в план заносятся фичи
 

wanderer

PHP - rulez!...
хм... так ведь на один план много фич... как это так получается-то?
на один план порядка 30 фич. или твоё предложение заключалось в том, чтобы таблицу с планами просто разделить на общую информацию и на фичи? тогда всё понятно, но я не вижу в этом смысла.....
 

wanderer

PHP - rulez!...
я вот подумал, а можно ли это сделать через временную таблицу?.... можно ли как из таблицы site_users_plans_features скопировать записи, только чтобы во временной таблице поля были не feature_name и feature_value, а были такие: имя поля равно feature_name, а её значение было бы равно feature_value?
я надеюсь ясно объяснил :) только я думаю из-за этого скорость будет терятся.
 

Yurik

/dev/null
блин, ну нелогично же получается твоя схема БД. Фичи же одни на все планы, только значения разные. Не поряд. Вот держи рабочий запрос
[sql]
SELECT DISTINCT plans.id
FROM plans INNER JOIN (features INNER JOIN plandetails ON features.id = plandetails.idfeature) ON plans.id = plandetails.idplan
WHERE (features.id=1 AND plandetails.charvalue='Linux') OR ( features.id=2 AND plandetails.charvalue='Apache');
[/sql]
а вот графические пояснения к нему
http://multicms.by.ru/wanderer.gif
 

wanderer

PHP - rulez!...
у меня ещё есть поле в таблице site_users_plans plan_type, которая и определяет тип плана. а для разных типов - разные фичи
 

Yurik

/dev/null
Нельзя заносить в поле фич их значения, ведь одна и та же фича в разных планах имеет разные значения.
Чё то я не понимаю чем тебе не подошел мой запрос и структура БД. Заходи в канал если что.
 
Сверху