Это потому, что я не могу использовать переменную для имени таблицы?
Да, или для других имен схем, таких как столбцы. Строковые переменные можно использовать только в том случае, если MySQL ожидает строку, заключенную в кавычки '
.
Если вам действительно нужно это сделать, вы можете с помощью «динамического SQL»: создать весь запрос в виде строки, объединить @tblname
в строку в то время и выполнить лот с помощью EXECUTE, Это довольно уродливо и может привести к SQL-инъекции, если вы не будете осторожны, поэтому избегайте его, если есть какая-либо другая опция.
ВЫБРАТЬ myfield ИЗ mytable GROUP BY tmpcheck
ИМЕТЬ (COUNT (tmpcheck
)> 1)
Это кажется мне проблематичным. Если myfield
не имеет функциональной зависимости от tmpcheck
(какой AFAICS он не может, поскольку tmpcheck
не является первичным ключом), это недопустимый ANSI SQL. MySQL позволил бы вам сойти с рук, но вы бы сказали, что «для каждой группы строк, имеющих значение tmpcheck
, выберите fieldname
из одной строки из этой группы в случайном порядке для последующего удаления ». Это действительно то, что вы хотите? Я ожидаю, что вы захотите удалить всех, кроме одного дубликатов.
Обычно для удаления дубликатов такая сложная процедура не требуется. Просто используйте DELETE-join:
DELETE my0
FROM mytable AS my0
JOIN mytable AS my1
ON my1.checkfield1=my0.checkfield1 AND my1.checkfield2=my0.checkfield2
AND my1.id>my0.id;
Предполагается, что поле id
является упорядоченным и UNIQUE
, так что вы можете решить, какой ряд будет оставаться (здесь, с самым высоким id
). myfield
может быть этим полем, но я не могу понять из контекста.