Как взять данные из sqlite3 select в другой sqlite3 запрос в where?
Основной вопрос и проблема:
У меня есть две таблица - roulette_users и users. Мне нужно взять user_id из roulette_users и используя его сделать запрос SELECT из users где user_id в 1 и 2 столбце равны. Не понимаю как это сделать без внешнего for, может быть есть какие то вариации, где я могу приравнять where к for из первой таблицы?
Если просто прописать, for user_game in users_game - Тут я беру данные из первой таблицы, - то данные во второй таблиице не будут найдены и запрос будет пустым.
Уточнение:
Именно так мне нужно расписать, потому что потом выводится сообщение со всеми пользователями и их результатами. Если ставить это сообщение в for, то у меня выводится не одно сообщение, а множество сообщений - их количество равно количеству пользователей в roulette_users.
Фрагмент из кода с выводом данных:
cur.execute('SELECT user_id, bid, bid_money FROM roulette_users WHERE group_id=("%s")' % group_id)
users_game = cur.fetchall()
conn.commit()
cur.execute('SELECT nickname, balance FROM users WHERE user_id=("%s")' % (for user_game[0] in users_game))
users = cur.fetchall()
conn.commit()
Весь код:
if message.chat.id < 0:
if rt == 'го':
conn = sqlite3.connect('database.db', check_same_thread=False)
cur = conn.cursor()
cur.execute('SELECT group_id FROM roulette WHERE group_id=("%s")' % group_id)
group_info = cur.fetchall()
conn.commit()
result = 2
if len(group_info) == 0:
return
else:
cur.execute('SELECT user_id, bid, bid_money FROM roulette_users WHERE group_id=("%s")' % group_id)
users_game = cur.fetchall()
conn.commit()
cur.execute('SELECT nickname, balance FROM users WHERE user_id=("%s")' % (for user_game[0] in users_game))
users = cur.fetchall()
conn.commit()
print(users)
for user_game in users_game:
# result = random.randint(0, 36)
bid = user_game[1]
bid_money = user_game[2]
if bid == result:
cur.execute('UPDATE users SET balance=balance+("%s") WHERE user_id=("%s")' % (
bid_money * 2, user_game[0]))
conn.commit()
cur.execute('DELETE FROM roulette_users WHERE group_id=("%s")' % group_id)
conn.commit()
bot.send_message(message.chat.id, text="Результаты рулетки: \n\n" + "\n".join(
f'[{user[0]}](tg://user?id={user_game[0]}) вы {f"выиграли {user_game[2] * 2}?" if user_game[1] == result else f"проиграли {user_game[2]}?"}'
for user_game in users_game for user in users), parse_mode='Markdown', disable_web_page_preview=True)
cur.execute('DELETE FROM roulette WHERE group_id=("%s")' % group_id)
cur.close()
conn.close()
Возможно кто-то мог бы помочь с более правильным выводом итогового сообщения, чтобы я не сталкивался с проблемами, которые описал.
Таблицы:
Ответы (2 шт):
SELECT *
FROM roulette_users tbl1
LEFT JOIN users tbl2 ON tbl2.user_id=tbl1.user_id
В выборке будут все столбцы из двух таблиц и соединены будут по полю user_id. Если я верно понял, что все такие нужно достать
* использовать нежелательно, лучше перечислить необходимые столбцы, например:
tbl1.user_id, tbl1.group_id, tbl2.balance
Если я правильно понял Вашу задачу, то можно использовать оператор JOIN, который объединяет таблицы. Затем добавить условие.
cur.execute("""SELECT users.*
FROM roulette_users
JOIN users ON roulette_users.user_id = users.user_id""")
data = cur.fetchall()
for i in data:
print(i)
Есть также способ через вложенный запрос:
cur.execute("""SELECT *
FROM users
WHERE user_id IN (SELECT user_id FROM roulette_users)""")
data = cur.fetchall()
for i in data:
print(i)
Дополнительно:
Для запроса SELECT не нужно использовать commit.
Если задача отличается, то напишите в комментариях, я постараюсь изменить ответ на более подходящий.


