Когда я пытаюсь выполнить этот запрос в Access через интерфейс ODBC в базу данных MySQL, я получаю ошибку «Слишком сложное выражение в выражении запроса». Самое важное, что я пытаюсь сделать, - это переводить сокращенные названия языков на английский язык. Мне было любопытно, если бы был какой-то способ «обмануть» доступ, думая, что выражение меньше с подзапросами, или кто-то еще лучше представлял, как решить эту проблему. Я думал о создании временной таблицы и ее объединении, но это не поддерживается в Access SQL.
Так же, как к вашему сведению, запрос работал нормально, пока я не добавил большую длинную цепочку IFF. Я проверил запрос в меньшей цепочке IFF для трех языков, и это не было проблемой, поэтому проблема определенно проистекает из огромной цепочки IFF (она глубже 26). Кроме того, я мог бы отказаться от некоторых опций (например, комбинировать различные формы китайского или португальского)
В качестве теста я смог заставить SQL-запрос работать после преобразования его в 14 операторов IFF (), но это далеко от 26 языков, которые я хотел бы представить.
SELECT TOP 5 Count( * ) AS [Number of visits by language], IIf(login.lang="ar","Arabic",IIf(login.lang="bg","Bulgarian",IIf(login.lang="zh_CN","Chinese (Simplified Han)",IIf(login.lang="zh_TW","Chinese (Traditional Han)",IIf(login.lang="cs","Czech",IIf(login.lang="da","Danish",IIf(login.lang="de","German",IIf(login.lang="en_US","United States English",IIf(login.lang="en_GB","British English",IIf(login.lang="es","Spanish",IIf(login.lang="fr","French",IIf(login.lang="el","Greek",IIf(login.lang="it","Italian",IIf(login.lang="ko","Korean",IIf(login.lang="hu","Hungarian",IIf(login.lang="nl","Dutch",IIf(login.lang="pl","Polish",IIf(login.lang="pt_PT","European Portuguese",IIf(login.lang="pt_BR","Brazilian Portuguese",IIf(login.lang="ru","Russian",IIf(login.lang="sk","Slovak",IIf(login.lang="sl","Slovenian","IIf(login.lang="fi","Finnish",IIf(login.lang="sv","Swedish",IIf(login.lang="tr","Turkish","Unknown")))))))))))))))))))))))))) AS [Language]
FROM login, reservations, reservation_users, schedules
WHERE (reservations.start_date Between DATEDIFF('s','1970-01-01 00:00:00',[Starting Date in the Following Format YYYY/MM/DD]) And DATEDIFF('s','1970-01-01 00:00:00',[Ending Date in the Following Format YYYY/MM/DD])) And reservations.is_blackout=0 And reservation_users.memberid=login.memberid And reservation_users.resid=reservations.resid And reservation_users.invited=0 And reservations.scheduleid=schedules.scheduleid And scheduletitle=[Schedule Title]
GROUP BY login.lang
ORDER BY Count( * ) DESC;
@ Майкл Тодд
Я полностью согласен. Список языков должен был быть таблицей в базе данных, а login.lang должен был быть FK в этой таблице. К сожалению, это не то, как база данных была написана, и это не мое изменение. Языки помещаются в поле login.lang PHP, работающим над базой данных.