LINUX.ORG.RU

ошибка в sql запросе

 


0

1

Здравствуйте. Помогите пожалуйста найти синтаксическую ошибку в sql запросе:

$query="INSERT INTO balance ( bs_value, bs_name, bs_date, bs_direction )
SELECT post_pay*Nz(factors_exp.exp_factor) AS zpsize, \"Зарплата \"+T1.user_aname+\" \"+T1.user_bname AS bs_name, Now() AS bs_date, \"-\" AS bs_direction
FROM (SELECT (year(Now())-year(user_start_date)) AS YearAllWork, * FROM workers INNER JOIN post ON workers.user_post=post.post_id)  AS T1 INNER JOIN factors_exp ON T1.YearAllWork = factors_exp.exp_years
";

При выполнении следующий выхлоп:

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 '* FROM workers INNER JOIN post ON workers.user_post=post.post_id) AS T1 INNER J' at line 3

★★★

Последнее исправление: disee (всего исправлений: 1)

bs_value AS zpsize

не?

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

Munhgauzen
()
Ответ на: комментарий от Munhgauzen

Да не, алиас не виноват. Нельзя делать так:
select a, * from t;

надо делать так:
select a, t.* from t

Соответственно, в запросе должно быть:
... AS YearAllWork, workers.* FROM workers ...

угадал?

SOmni ★★
()
Ответ на: комментарий от SOmni

неа. пробовал уже. тогда говорит что мол не знаю что такое post_pay.
тогда пробовал сделать workers.*, post.* FROM workers ....
вышла таже самая первая ошибка

disee ★★★
() автор топика
Ответ на: комментарий от Munhgauzen

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

Я совсем недавно начал постигать азы sql запросов, и хотелось бы что бы по моему коду не говорили что я из индии

disee ★★★
() автор топика
Ответ на: комментарий от disee

Не могли бы вы, попродробнее объяснить, что именно в моем запросе не красиво?

Я в красоте не специалист, не скажу. Просто вот так взять и вынести чуть не всю бизнес-логику в запросы... Обычно в web это заканчивается тормозами, когда такие запросы «застревают» надолго, мешая всему приложению.

Я бы сделал выборку необходимых данных первым запросом (или даже несколькими простыми). Потом в Пых-коде посчитал, что там надо. И результаты записал вторым запросом из итоговых переменных.

А изгаляться в трехэтажных запросах? Это удел яйцеголовых :)

Munhgauzen
()

В моем T-SQL у меня получается вот что:

INSERT INTO balance ( bs_value, bs_name, bs_date, bs_direction )
SELECT
	post_pay*Nz(factors_exp.exp_factor) AS zpsize
	,'Зарплата '+T1.user_aname+' \'+T1.user_bname AS bs_name
	,Now() AS bs_date
	,'-' AS bs_direction
FROM
	(SELECT
		(year(Now())-year(user_start_date)) AS YearAllWork
		,workers.*
	FROM
		workers
		INNER JOIN post ON workers.user_post=post.post_id) AS T1
	INNER JOIN factors_exp ON T1.YearAllWork = factors_exp.exp_years
Ошибки я увидел две:
1. Вместо workers.* ты написал просто *
2. У полей post_pay, Nz и user_start_date не указаны таблицы, из которых эти поля нужно достать. Я не стал гадать, а оставил эту работу тебе.

Ну и zpsize я бы все же заменил на bs_value, потому что дезинформирует немного.

delete83 ★★
()

если вы всё пихаете в один запрос, так хоть форматируйте его по-человечески. ну хоть так: http://www.mysql.ru/docs/man/Twin_pool.html

ваши макароны разбирать нет никакого желания.

drBatty ★★
()

В этом запросе ошибка не синтаксическая, в этом запросе ошибка в его авторе.

VirRaa ★★★
()

ymmd

FROM (SELECT (year(Now())-year(user_start_date)) AS YearAllWork, * FROM workers

почему не

YEAR(NOW())-YEAR(user_start_date) AS `YearAllWork`, `workers`. * FROM `workers`
у вас каша в голове если вы такое городите для такой простой выборки.

RR
()
Ответ на: ymmd от RR

YEAR(NOW())-YEAR(user_start_date) AS `YearAllWork`, `workers`. * FROM `workers`

У меня от вашего запроса пхпмайадмин.

\«Зарплата \»+T1.user_aname+\" \«+T1.user_bname AS bs_name

Автор, если ты будешь пихать такие вещи в модель, твоему проекту скоро наступит задница.

А T1 - это хуже, чем int i = x(f(r, m, k), p); //вычисление зарплаты сотрудника

Yasenfire
()
Ответ на: комментарий от disee

Значит workers.* - это только одна из ошибок, это именно то, о чём говорит твоё первое сообщение. Оставь workers.*
И сделай t1.post_pay и далее по списку, определи таблицы, откуда берутся все поля, на которые ругается парсер.

SOmni ★★
()
Ответ на: комментарий от Munhgauzen

... первым запросом... Потом в Пых-коде посчитал... результаты записал вторым запросом

Речь идёт о балансе, так что нужно не забыть запихнуть это всё в транзакцию.

SOmni ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.