Перестал работать запрос

aleksey_sql

Привет всем!После смены версии mysql на сервере перестал работать запрос следующего вида:
(SELECT sa.IpAddress, c.Name, SUM(sa.CountViews) as CountViews FROM (`stata_by_art` sa) LEFT JOIN clients c ON (c.Id = sa.IdClient) WHERE DATE(sa.DateTime) >= '2012-05-11' AND DATE(sa.DateTime) <= '2012-05-11' AND sa.IdClient != -1 GROUP BY sa.IdClient) UNION (SELECT sa.IpAddress, 'Anonymouth', SUM(sa.CountViews) as CountViews FROM (`stata_by_art` sa) LEFT JOIN clients c ON (c.Id = sa.IdClient) WHERE DATE(sa.DateTime) >= '2012-05-11' AND DATE(sa.DateTime) <= '2012-05-11' AND sa.IdClient = -1 GROUP BY sa.IpAddress) &#65279;
Причем по отдельности каждая часть запроса (слева и справа от UNION) - работают. А когда пишу так, как привел выше, то выдет следующую ошибку:#1064 - 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 'LEFT JOIN clients c ON (c.Id = sa.IdClient) WHERE DATE(sa.DateTime) >= '2012-05-' at line 1Подскажите, пожалуйста, в чем может быть проблема. Заранее спасибо!
12 ответов

aleksey_sql

aleksey_sql,А что это за мусор в конце запроса?


aleksey_sql

мусора в запросе нет. это видимо так вставилось просто.вот запрос:
(
SELECT sa.IpAddress, c.Name, SUM( sa.CountViews ) AS CountViews
FROM (
`stata_by_art` sa
)
LEFT JOIN clients c ON ( c.Id = sa.IdClient ) 
WHERE DATE( sa.DateTime ) >= '2012-05-11'
AND DATE( sa.DateTime ) <= '2012-05-11'
AND sa.IdClient != -1
GROUP BY sa.IdClient
)
UNION (

SELECT sa.IpAddress, 'Anonymouth', SUM( sa.CountViews ) AS CountViews
FROM (
`stata_by_art` sa
)
LEFT JOIN clients c ON ( c.Id = sa.IdClient ) 
WHERE DATE( sa.DateTime ) >= '2012-05-11'
AND DATE( sa.DateTime ) <= '2012-05-11'
AND sa.IdClient = -1
GROUP BY sa.IpAddress
)


aleksey_sql

зачем вообще тут юнион? что за пляски с ">=" и "<="? это вы одни сутки так выбираете? и почему срц=плскл?
SELECT sa.IpAddress , case when sa.IdClient=-1 then 'Anonymouth' else c.Name end as `name` , SUM( sa.CountViews ) AS CountViews FROM `stata_by_art` sa LEFT JOIN clients c ON c.Id = sa.IdClient WHERE DATE( sa.DateTime ) = '2012-05-11' /*WHERE sa.DateTime >= '2012-05-11' AND sa.DateTime < '2012-06-11' */ GROUP BY sa.IdClient ORDER BY sa.IdClient !=-1
это работает?


aleksey_sql

Мой запрос вполне осмыслен и валиден. Это вытаскавание статистики для зарегистрированных и анонимных пользователей. Плясок с <= и>= нету. Это выборка диапазона дат, просто в данном примере - это одна дата.Ваш запрос не работает как надо.Вопрос был в том, что левая и правая части запроса по отдельности работают, а всё вместе, объединенное с UNION, после обновления сервера перестало работать. Собственно в этом и прошу помощи.


aleksey_sql

>Это выборка диапазона дат, просто в данном примере - это одна дата.Если есть индекс по времени, советую сделать условие как у меня в закомментированном участке.>Ваш запрос не работает как надо.Неправильные результаты или вообще не выполняется?>Вопрос был в том, что левая и правая части запроса по отдельности работают, а всё вместе, объединенное с UNION, после обновления сервера перестало работать.ха, сейчас на своей базе побаловался со скобками, воспроизвёл. Уберите скобки тут
FROM (
`stata_by_art` sa
)
, и должно заработать. Похоже, баг мускля.


aleksey_sql

И в правду заработало без скобок. Вот так баг! Спасибо! Я думаю, этот баг мона в FAQ разместить)А твой запрос работает, но мне не нужно группировать клиентов неавторизованных, чтобы айпишник можно было каждого NA увидеть.Спасибо!


aleksey_sql

aleksey_sql, только теперь я понял, что проглядел, что группировка разная в запросах :)ЗЫ. вообще-то так, как сделано в первом запросе(и у меня-проглядел) группировать нельзя, но всем ведь пофиг, да? :)


aleksey_sql

Похоже, баг мускля.
Это не баг MySQL. Это баг безграмотного пользователя. Как, по твоему, сервер должен интерпретировать выражение в скобках?Было бы
FROM (
`stata_by_art`
) sa
сервер бы прекрасно понял, что от него требуется.И вообще - натыкивание скобок и кавычек где не попадя, в надежде, что сервер разгребёт этот бред - плохая практика.


aleksey_sql

Было бы
FROM (
`stata_by_art`
) sa
сервер бы прекрасно понял, что от него требуется.
Слона-то я и не приметил. Точно, это просто алиас не там, где надо, присваивается :)>И вообще - натыкивание скобок и кавычек где не попадя, в надежде, что сервер разгребёт этот бред - плохая практика.+много


aleksey_sql

Проблема то уже решена.Akina давай дневник, 5 с плюсом тебе поставлю за грамотность!


aleksey_sql

Проблема то уже решена.Akina давай дневник, 5 с плюсом тебе поставлю за грамотность!
Не нравится? но если ты не будешь знать СУТЬ своего ляпа - так и будешь дальше плодить чёрт знает что и удивляться, какого рожна не работает...


aleksey_sql

Спасибо тебе!