#mysql
#mysql
Вопрос:
Я работаю в очень ограниченной среде MySQL (все вызовы MySQL передаются как параметры массива). Проблема в том, что я не знаю, как разрешить неоднозначное условие.
В этой среде все вызовы MySQL принимают такую форму:
SELECT value1,value2,...,valueN
FROM table1,table2,...,tableN
WHERE cond1 OP cond2 OP ... OP condN
Это не проблема, пока у вас не будут одинаковые имена столбцов в table1 и table2. Представьте, что в таблице 1 есть столбцы {a, b, z}, а в таблице 2 есть имена столбцов {c, d, f, z}. Я могу сделать это:
SELECT *
FROM table1, table2
WHERE a='3' AND table1.z='5'
Идеально, но одно из ограничений заключается в том, что я не могу использовать формат table1.z, просто z =’5′, что приводит к коллизии.
Итак, вопрос в следующем: есть ли какой-либо способ предотвратить эту двусмысленность без использования префикса имени таблицы в части условия? (например, было бы здорово, если бы был способ использовать только часть таблицы2 или сказать, что таблица1 имеет приоритет в случае двусмысленности).
Комментарии:
1. Почему вы не можете использовать имена таблиц или псевдонимы таблиц? Необходимость игнорировать совершенно простое решение этой проблемы является странным ограничением…
2. Большинство библиотек MySQL включают способ указания имени таблицы / схемы для столбца. Какой язык и фреймворк вы используете для своих вызовов MySQL?
3. Потому что таковы требования 🙂 Он используется в визуальном редакторе, который позволяет пользователям «играть» с некоторыми простыми предложениями mysql.
4. Нет, это просто ограниченная среда 🙂
Ответ №1:
Невозможно избежать столкновения, если вы не можете определить, из какой таблицы происходит «MyColumn».
Ваши ограничения кажутся немного глупыми… Вы в основном запрашиваете действительный результат, когда утверждаете, что не можете написать действительный SQL….
Возможно, вместо SELECT
ввода из table1 вы бы SELECT
использовали вложенный подзапрос, в котором вы присвоили псевдонимы именам столбцов…
Например:
если в table1 и table2 есть столбец «MyColumn»
, а не:
SELECT
*
FROM
table1,table2
WHERE myColumn = @value -- produces collision!
Не могли бы вы сказать:
SELECT
*
FROM
(SELECT myColumn AS foo FROM table1) newTable1,
(SELECT myColumn AS bar FROM table2) newTable2
WHERE
foo = @value
Таким образом, вы не полностью определяете таблицы во внешнем WHERE
предложении, но вы переназначаете столбцы внутри подзапросов (таким образом, преобразуя их в разные имена для внешнего запроса)
Это похоже на обходное упражнение, хотя
РЕДАКТИРОВАТЬ:
http://thedailywtf.com/Articles/SQL-Sentences.aspx
«Предложения MySQL?»