UPDATE (
SELECT `id`,
(
SELECT COUNT(*)
FROM `table` AS `c`
WHERE `c`.`city_id` = `x`.`city_id` AND `c`.`rank` <= `x`.`rank`
) AS `r`
FROM `table` AS `x`
) AS `t`
JOIN `table` ON `table`.`id` = `t`.`id`
SET `table`.`city_rank` = `t`.`r`
<template>
<div class="accordion-body">
<div class="mb-3" v-if="itemsList">
<select
class="form-select"
size="4"
multiple
aria-label="multiple select example"
v-model="itemSelected"
>
<option v-if="itemsList.length === 0" disabled
>Значений нет, добавьте новое</option
>
<option v-else disabled>Выберите значение</option>
<option
v-for="item in itemsList"
:key="item.id"
:value="item._id"
>{{ item.value }}
</option>
</select>
<button
class="btn btn-sm btn-outline-danger mt-2"
type="button"
@click="removeItem(itemSelected[0])"
>
Удалить
</button>
</div>
<div class="input-group">
<input
type="text"
:class="['form-control', { 'is-invalid': qError }]"
:placeholder="placeholder"
:aria-label="placeholder"
aria-describedby="button-addon2"
v-model="newItem"
@blur="qBlur"
@change="qChange"
/>
<button
class="btn btn-outline-secondary"
type="button"
@click="onSubmitNewItem"
>
Добавить
</button>
</div>
<div class="form-text text-danger" v-if="qError">
{{ qError }}
</div>
</div>
</template>
<script>
import { ref, computed, onMounted } from "vue";
import { useStore } from "vuex";
import { useField, useForm } from "vee-validate";
import * as yup from "yup";
export default {
props: {
storeName: { type: String, required: true },
placeholder: { type: String, required: true },
error: { type: String, required: true },
},
setup(props) {
//подключаем store
const store = useStore();
//выбранное значение из select
const itemSelected = ref([]);
//
const { isSubmitting, handleSubmit, resetForm } = useForm();
const {
value: newItem,
errorMessage: qError,
handleBlur: qBlur,
handleChange: qChange,
} = useField(
"newItem",
yup
.string()
.trim()
.required(props.error)
);
//загрузка значений:
onMounted(async () => {
//выполнение в store экшена load
await store.dispatch(`${props.storeName}/load`);
});
// возвращаем значение itemsList из store (берем список значений из store)
const itemsList = computed(
() => store.getters[`${props.storeName}/itemsList`]
);
//добавить новое значение:
const submitnewItem = async (values) => {
// вызываем метод create для создания записи в БД
await store.dispatch(`${props.storeName}/create`, values);
//обновить список:
await store.dispatch(`${props.storeName}/load`);
//очистка поля ввода
resetForm();
};
const onSubmitNewItem = handleSubmit(submitnewItem);
//удалить значение:
const removeItem = async (id) => {
await store.dispatch(`${props.storeName}/remove`, id);
//обновить список:
await store.dispatch(`${props.storeName}/load`);
//очистить список значений на удаление:
itemSelected.value = [];
};
return {
itemsList,
removeItem,
itemSelected,
isSubmitting,
onSubmitNewItem,
newItem,
qError,
qBlur,
qChange,
resetForm,
};
},
};
</script>
let users = await Promise.all(data.map((u) => fetch(u).then((r) => r.json())));
'h'.charCodeAt(0)