Как можно выполнить запрос к базе данных, чтобы получить только те данные, которые связаны с определённой таблицей?

У меня есть две функции, которые работают с библиотекой aiogram и базой данных SQLite. Код этих функций приведен ниже:

```python
async def categories(): 
    all_categories = await get_cat() 
    keyboard = InlineKeyboardBuilder() 
    for category in all_categories: 
        keyboard.add(InlineKeyboardButton(text=category.name, callback_data=f'category_{category.id}')) 
    return keyboard.adjust(1).as_markup() 

async def place(): 
    all_places = await get_cat_place() 
    keyboard = InlineKeyboardBuilder() 
    for place in all_places: 
        keyboard.add(InlineKeyboardButton(text=place.name, callback_data=f'place_{place.id}')) 
    return keyboard.adjust(1).as_markup() 
```

У меня есть две кнопки, которые взаимодействуют с базой данных. Я хотел бы изменить функцию `place` так, чтобы при выборе категории, например, "кепки", отображались только те магазины, которые привязаны к этой категории. В текущей реализации, при нажатии на кнопку "кепки", выводится список из всех шести магазинов, но мне нужно, чтобы отображались только два магазина, связанные с категорией "кепки". 

Ниже представлена структура базы данных:
1. Таблица `categories` содержит только имя и ID с тремя категориями: кепки, футболки и кроссовки.
2. Таблица `place` также содержит имя и ID с шестью магазинами города.
3. Таблица `item` содержит имя, ID, описание, цену и привязку к магазинам из таблицы `place`.

Как мне изменить функцию `place`, чтобы она выводила только магазины, связанные с выбранной категорией?
  • 23 декабря 2024 г. 16:54
Ответы на вопрос 2
Для того чтобы извлечь только те магазины, которые связаны с определенной категорией, вам нужно изменить функцию `place`, чтобы она принимала ID категории в качестве аргумента и затем выполняла SQL-запрос для получения магазинов, относящихся к этой категории.

Предполагая, что у вас есть связь между таблицами `item` и `place` (например, через ID магазина) и между таблицей `item` и `categories`, вам потребуется выполнить JOIN-запрос между этими таблицами.

Вот как можно изменить функцию `place`:

1. Добавьте аргумент `category_id` в функцию `place`.
2. Выполните SQL-запрос для получения магазинов, связанных с этой категорией.

Пример кода:

```python
async def place(category_id): 
    # Выполняем SQL-запрос для получения магазинов, связанных с данной категорией
    query = """
    SELECT p.* FROM place p
    JOIN item i ON p.id = i.place_id
    WHERE i.category_id = ?
    """
    # Здесь 'db' - это ваша связь с базой данных. Замените это на ваш способ доступа к БД.
    async with db.execute(query, (category_id,)) as cursor:
        all_places = await cursor.fetchall()

    keyboard = InlineKeyboardBuilder() 
    for place in all_places: 
        keyboard.add(InlineKeyboardButton(text=place.name, callback_data=f'place_{place.id}')) 
    return keyboard.adjust(1).as_markup()
```

Не забудьте заменить `db` на вашу реальную единицу подключения к базе данных. Этот код делает следующее:

- Выполняет JOIN между таблицами `place` и `item`, чтобы получить все магазины (`place`), которые имеют привязанные товары (`item`) в заданной категории (`category_id`).
- Затем создаёт клавиатуру с кнопками для этих магазинов.

При вызове `place`, вам нужно будет передать ID категории, на которую нажали. Например, при обработке нажатия кнопки категории, вы можете получить ID категории и передать его в функцию `place`. 

Пример обработки нажатия на кнопку:

```python
@dp.callback_query_handler(lambda c: c.data.startswith('category_'))
async def process_category(callback_query: CallbackQuery):
    category_id = int(callback_query.data.split('_')[1])
    keyboard = await place(category_id)
    await callback_query.message.answer("Выберите магазин:", reply_markup=keyboard)
```

Таким образом, при нажатии на кнопку с категорией "кепки" вы получите только те магазины, которые связаны с данной категорией.
SQL запрос покажи, причем здесь телеграм?
Похожие вопросы