[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите найти ошибку в MYSQL-запросе
Kiarra
Добрый день! Есть сложный mysql-запрос, выдает синтаксическую ошибку при запуске скрипта:

 $query5 = $db->query("SELECT name, product_id,
( 0 + IF (name LIKE 'зелен%плать%москв', 20*3, 0)+ IF (name LIKE '%зелен%', 10, 0)+
IF (name LIKE '%плать%', 10, 0) + IF (name LIKE '%москв%', 10, 0) AS `relevant`
FROM "
. DB_PREFIX . "product_description
WHERE language_id = 1 AND meta_keyword = '' AND (
name LIKE '%зелен%плать%москв%' OR name LIKE '%зелен%' OR name LIKE '%плать%' OR
name LIKE '%плать%')
ORDER BY relevant DESC LIMIT 1, 20"
);


sergeiss
А что за ошибка-то? Ты уж поделись с нами, чтобы "не гадать на кофейной гуще" smile.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Kiarra
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS `relevant` FROM oc_product_description WHERE ( name LIKE '%зелен%пл' at line 3
Error No: 1064
T1grOK
( 0 + IF (name LIKE 'зелен%плать%москв', 20*3, 0)+ IF (name LIKE '%зелен%', 10, 0)+
IF (name LIKE '%плать%', 10, 0) + IF (name LIKE '%москв%', 10, 0)??? AS `relevant`
Скобка не закрыта

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Kiarra
ой...)) спасибо!)
T1grOK
Кстати запрос можно написать и без IF в данном случае.
$query5 = $db->query("SELECT name, product_id,
( 0 + (name LIKE 'зелен%плать%москв') * 60
+ (name LIKE '%зелен%') * 10
+ (name LIKE '%плать%') * 10
+ (name LIKE '%москв%') * 10)) AS `relevant`
FROM "
. DB_PREFIX . "product_description
WHERE language_id = 1 AND meta_keyword = '' AND (
name LIKE '%зелен%плать%москв%' OR name LIKE '%зелен%' OR name LIKE '%плать%' OR
name LIKE '%плать%')
ORDER BY relevant DESC LIMIT 1, 20"
);


_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
SlavaFr
@Kiarra в следующий раз старайся избегать в SQL те математические подсчеты которые включают в себе логику (if) для представления, а не поиска данных. Да, база данных может это делать, но в принципе это задание для скрипта, а база данных создана для хранения информации и поиска информации на основании поисковых критериев.

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
Valick
Цитата
а база данных создана для хранения информации и поиска информации на основании поисковых критериев

ниразу не согласен, база создана для хранения, поиска и обработки (!) информации


_____________
Стимулятор ~yoomoney - 41001303250491
AllesKlar
Цитата (Valick @ 19.03.2014 - 13:32)
Цитата
а база данных создана для хранения информации и поиска информации на основании поисковых критериев

ниразу не согласен, база создана для хранения, поиска и обработки (!) информации

А вот я согласен.
Иначе, при изменнении логики скрипта, придется переписывать не только обработчики, но и сами запросы.

_____________
[продано копирайтерам]
sergeiss
Цитата (AllesKlar @ 19.03.2014 - 13:59)
А вот я согласен.
Иначе, при изменнении логики скрипта...

"Позвольте вам не позволить!" smile.gif

При изменении логики скрипта все равно что-то менять придется. Но в любом случае максимально правильно будет всё делать на стороне БД, а в ПХП только получать готовый результат. Для часто выполняемых сложных запросов, особенно когда есть вероятность их вызова из разных мест, можно (и нужно) создать вьюшки и функции. Так что Valick прав.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
AllesKlar
sergeiss
Это вечный, никогда неразрешимый вопрос - удобство кода vs производительность приложения.
Удобство кода - меньше багов, быстрое внедрение новых решений.
Производительность - ну, тут все ясно. Яркий пример ассемблер.

Посмотрим в сторону Java. Там есть такая штука, как Hibernate - супе-пупер-классная штукень!
Смысл ее в том, что каждая из основных (не связующих) таблиц базы представленна своим классом.

Например, Человек имеет несколько адресов.
Класс Человек имеет свойство типа массив, элементами которого являются объекты класса Адрес.

И каждый из объектов класса Адрес сам идет в базу и заполняет свои свойства.

Это очень удобно, прозрачно, быстро.
Но мы пораждаем множество обращений к базе.
Можно было бы одним запросом с JOIN вытащить все адреса и заполнить объекты.
Это было бы намного производительнее, но это уже не удобно, замедляет разработку и багфиксинг.

_____________
[продано копирайтерам]
SlavaFr
@sergeiss функцию которая выдает содержимое таблицы на основании твердых или динамичных критериев можно использовать всегда и для разных видов форматирования или подсчетов.
функцию которая будет заниматься формированием цифры с именем function getRelevance($productName) может тоже использоваться многократно или переделываться в зависимости от надобности не затрагивая основной запрос.
Даже исходя из правила "don't repeat Your self" и "Single Responsibility Principle" имеет смысл разделять эти обязанности.

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.