Я хочу при выполнении этого запроса
SELECT tabla1.campo1
From tabla1, tabla2
Where tabla1.campo1 = tabla2.campo1
Group By tabla1.campo1;
Что даст мне, например, 600 записей, сохраните 600 записей в массиве, чтобы позже использовать индекс массива (от 1 до 600) в качестве сравнения в другом запросе, так как я должен использовать массив и цикл for, но я уже исследовал и не нашел четкого примера, я хотел бы знать следующее:
Может ли он делать то, что я хочу?
Это ресурсоэффективно?
Есть ли лучший метод?
Хотя MySQL не имеет типа данных
ARRAY
, я думаю, что вы хотите использовать результат вашего запроса позже, без необходимости писать его снова и снова. Это возможно: вы можете сохранить результат во временной таблице и использовать его столько раз, сколько захотите:Теперь, если вам нужно присвоить номер каждой записи, вы можете использовать пользовательские переменные:
Помните: временные таблицы видны только создавшему их соединению и уничтожаются после закрытия создавшего их соединения.
Обновить
Как видите, я не использую хранимую процедуру для создания требуемой таблицы, а скорее генерирую нужные вам номера строк на лету.
Как это работает?
В предложении
FROM
я включаю две ваши таблицы и подзапрос (который я называюinit
) для инициализации переменной@n
. Помните, что в SQL "порядок выполнения" таков:FROM
: сервер проверяет, что источники данных существуют и могут быть прочитаны; Кроме того, устанавливаются необходимые отношенияWHERE
: соответствующие фильтры применяются к источникам данных.GROUP BY
: данные сгруппированыSELECT
: считываются поля и вычисляются выражения (включая выражения агрегации).HAVING
: соответствующие фильтры применяются к данным после их группировки.Итак, воспользовавшись тем, что первое, что выполняется, это
FROM
, я поместил туда запрос инициализации переменной (init
). Переменная@n
инициализируется нулем, и каждый раз, когда онаSELECT
читает строку, она обновляет значение@n
, добавляя к нему 1.Наконец, создавая временную таблицу, вы гарантируете, что номера строк не будут обновляться каждый раз, когда вы выполняете запрос (поскольку вы не упорядочиваете значения, нет гарантии, что порядок строк будет соблюдаться).
После того, как вы запустите приведенные выше запросы, вы сможете использовать эти значения, просто выбрав все строки из вновь созданной таблицы:
Теперь я вижу, что вы не используете никаких функций агрегирования; Я думаю, что проще использовать
SELECT DISTINCT
:Почему «на лету» лучше, чем с процедурой?
Если вы хотите попробовать хранимую процедуру, рассмотрите следующее:
AUTO_INCREMENT
в определении таблицы, вместо этого вы хотите, чтобы процедура сохраняла число)Для простой экономии ключей следует генерировать значения «на лету». С другой стороны, генерируя значения «на лету» с помощью временных переменных, вы на самом деле не даете серверу слишком много дополнительной работы.