SQL + алиасы таблиц

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Lisolog
новенький
Сообщения: 39
Зарегистрирован: 13.12.2007 13:24:08
Откуда: Russia, SPb

SQL + алиасы таблиц

Сообщение Lisolog »

Неясная, но решаемая проблемка:
Самый простой запрос (был конечно сложнее):

Код: Выделить всё

select G.name from goods G

..вываливается с ошибкой. Лечится прямым указыванием таблов:

Код: Выделить всё

select goods.name from goods

Кто знает почему так?

Laz0.9.24 win/lin mysql5
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

а ошибку указать слабо ?
скорее всего проблема в парсере, попробуй отключите prepare
если так то ти пиши в трекер, ну или хотябы сюда если инглишь не любишь.
Lisolog
новенький
Сообщения: 39
Зарегистрирован: 13.12.2007 13:24:08
Откуда: Russia, SPb

Сообщение Lisolog »

Attid писал(а):а ошибку указать слабо ?
скорее всего проблема в парсере, попробуй отключите prepare
если так то ти пиши в трекер, ну или хотябы сюда если инглишь не любишь.


Егор знач такой, вполне обычный, говорящий мне что я SQL не знаю напроч :

Код: Выделить всё

"MySQL50Connection1 : Error executing query: 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 'G' at line 1"

С английским принципиально плохо - по сему не решусь.
2All: попробуйте у кого мускл5?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Lisolog
У меня Lazarus 0.9.25, FPC 2.2.0, MySQL 5.0.18.
Делаю:

Код: Выделить всё

SELECT G.name FROM otdels G

работает как часы, без малейшей ошибки.
Аватара пользователя
SHURA
незнакомец
Сообщения: 5
Зарегистрирован: 27.11.2007 17:32:26
Откуда: РФ, Киров

Сообщение SHURA »

На Lazarus 0.9.24 и MySQL 5.1.11 (Linux) работает.

Но недавно столкнулся с проблемой когда MySQL под линухом, что при запросе названия таблиц чувствительны к регистру, а названия столбцов нет. Под виндовым MySQL такого не было. Хотя чел, который занимается у нас Linux'ом сказал, что это в настройках самого Linux'а. Правда ли это?
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Правильный синтаксис:
SELECT G.name FROM otdels AS G
Lisolog
новенький
Сообщения: 39
Зарегистрирован: 13.12.2007 13:24:08
Откуда: Russia, SPb

Сообщение Lisolog »

В общем разобрался что это не в том проблема.
Рассматриваю логи мускла.
Лог Запроса 1:

Код: Выделить всё

23 Query       SELECT S.chk_id, S.prim, S.price_rozn, G.name FROM chk_slave AS S INNER JOIN goods AS G ON S.good_id=G.good_id
23 Query       show index from chk_slave AS S INNER JOIN goods AS G ON S.good_id=G.good_id

..не работает и вываливает ошибку:

Код: Выделить всё

Project raised exception class "EDatabaseError with message 
mysq: Error executing query: 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 S INNER JOIN goods AS S ON S.go###(gdb unparsed remainder...)###
[OK]


А вот Лог Запроса 2:

Код: Выделить всё

12 Query       SELECT G.name, (R.count-IF(EE.spis>0,EE.spis,0)) as itog, G.izm, W.bar FROM storage R 
LEFT JOIN ( SELECT S.good_id, M.bar_id, (SUM(S.amount*S.counts)) as spis FROM chk_slave S
INNER JOIN chk_master M ON M.chk_id=S.chk_id
WHERE M.status=1 and M.dateon between 20080415070000 and 20080416203058 and M.bar_id=0
group by M.bar_id,S.good_id ) EE ON EE.bar_id=R.bar_id and EE.good_id=R.good_id
INNER JOIN goods G on G.good_id=R.good_id
INNER JOIN warez W on W.id=R.bar_id
 where( G.group_id not in (14,15) and G.amount=1 and R.bar_id=0
 )order by G.name

... который работает
Сижу, пытаюсь думать...
Что означает в первом запросе "23 Query show index..." ?
Почему я не вижу этого во втором?
Lisolog
новенький
Сообщения: 39
Зарегистрирован: 13.12.2007 13:24:08
Откуда: Russia, SPb

Сообщение Lisolog »

Докопал:

судя по всему криво работает TSQLQuery.ParseSQL (пытается построить нереальный индекс), выключил - всё норм.

Тема закрыта - всем спаибо +)
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

Lisolog писал(а):Тема закрыта - всем спаибо +)

стоять ! как закрыта ? а кто будет баг в трекер писать ? описание что не так и меленький воспроизводимый пример или в трекер или сюда давай.
если с патчем то будет еще круче =)

Добавлено спустя 1 минуту 25 секунд:
Lisolog писал(а):Докопал:
выключил - всё норм.

копальщик, я еще неделю назад сказал его отключить =)
Lisolog
новенький
Сообщения: 39
Зарегистрирован: 13.12.2007 13:24:08
Откуда: Russia, SPb

Сообщение Lisolog »

Ну извини, не предал сразу значения, думал, что уже если парсер не должен глючить.(в следующий раз буду внимательнее)
На самом деле не мастер я в трекер писать, но исходные данные дам.
По поводу примера на несколько постов раньше лежит очевидный, хотя люди говорят, что у них работает и это меня сдерживает.
Патчами нет смысла естественно тоже кидаться.
Предположение:
парсер пытается использовать старые синтаксисы работы с мусклом, но могу ошибаться.
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

Lisolog писал(а):Ну извини, не предал сразу значения

да я не ругаюсь, я констатирую факт =)

Lisolog писал(а):По поводу примера на несколько постов раньше лежит очевидный, хотя люди говорят, что у них работает и это меня сдерживает.

если работает не у всех то это не пример, в прошлом сообщении ты там что-то про индекс говорил, хотя сам парсер индекс не строит, но может после како-то друго-го запроса проявляется.
ты пробывал на базе где только одна таблица к примеру ? в трекер после примера я отпишу. только по хорошему чтобы ты потом не пропал когда там вопросы задавать будут =)
Lisolog
новенький
Сообщения: 39
Зарегистрирован: 13.12.2007 13:24:08
Откуда: Russia, SPb

Сообщение Lisolog »

Ну в общем когда запрос к одной таблице - то проблем нет.
Типа

Код: Выделить всё

select pole1,pole2 from table

Ну если приколоться, и обращаться к полям сей таблицы (одной) по алиасу, то срабатывает вид:

Код: Выделить всё

select table.pole1, table.pole2 from table

или

Код: Выделить всё

select T.pole1, T.pole2 from table as T

, но неработает (хотя новые версии как MS так и MySQL-ов ховают) следующее:

Код: Выделить всё

select T.pole1, T.pole2 from table T

А вот с обращениями в кучу таблом начинаются приколы.
От 25.04.2008 16:12:31 я описал какие. До обоих запросов выполнется

Код: Выделить всё

SET character_set_client="utf8", character_set_connection="cp1251",character_set_results="utf8";

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

Код: Выделить всё

23 Query       show index from chk_slave AS S INNER JOIN goods AS G ON S.good_id=G.good_id

- ерунда полная, ну не индекс это

По поводу моей пропажи - она исключена, ибо проект слишком резиновый и растянутый надолго во времени, да и линь бесплатный - спрос есть, поэтому у меня всегда есть вопросы, а куда мне их задавать кроме чем сюда, правда можно в полумёртвую ru.delphi (fido). Ну а на мыло об ответах реагирую своевременно.
Ответить