Задать вопрос
@pphhpphh

Как получить колонку по ее значение?

Пример
у меня есть колонка 1, и у нее есть значение Сайт
Как мне получить название колонки, зная то что у нее одно значение равно "Сайт"?
PPkFVBGAT84.jpg?size=49x52&quality=96&sign=83ab53374514b3c852de88be4feaa8c9&type=album

Возможно это легко, но я туплю
Не пишите что бы я шел учить sqlite, я и так учусь, хотя бы напишите через что это можно получить
Я знаю как можно получить значение Сайт зная колонку, а как получить колонку зная значение Сайт я не знаю(

UPD:
Впринципе, вроде можно сделать так
all_stroks = q.execute(f"SELECT * FROM id_tovar")
        records = q.fetchall()
        for asd in all_stroks:
                if asd == "чему то":

Выводим все значения из таблицы id_tovar, а после проверяем равна ли какая та из строк тому чему нам надо, но надо как то записывать название столбца в котором имеется это что то
  • Вопрос задан
  • 129 просмотров
Подписаться 2 Простой 4 комментария
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Короче.
Основную идею я тебе дам, но всё равно почитай уже любой учебник!

Аналогия очень простая.
Строка таблицы = структура данных, типа класса. Таблица = коллекция однотипных структур данных.
Столбец - поле в структуре данных. Схема таблицы - описание структуры данных, т.е. набора полей.
Таким образом, изменение схемы таблицы - изменение состава структуры данных - это НЕ обычная операция.
Её не нужно использовать для добавления новых данных в коллекцию! Если ты добавляешь новые данные в коллекцию - это добавление строки, т.е. INSERT.

"А что делать, если у меня переменный набор данных? Например, есть чаты, и в них есть юзеры?"
У тебя несколько сущностей - в таких случаях тебе нужно несколько таблиц. Ключевой момент - сколько сущностей связано с той или иной сущностью.
Например, у нас есть чаты, и есть пользователи. Пользователь может быть в нескольких чатах, чат может иметь нескольких пользователей. Это называется "связь многие-ко-многим". Если сделать так, как ты делаешь сейчас, то будет таблица Чаты, и при добавлении пользователя в чат будет добавляться столбец в таблицу. Это неправильно!
Правильно: есть таблица Чаты (каждый чат имеет свой id - "ключ", "primary key"), таблица Пользователи (каждый имеет свой ключ) и вспомогательная таблица (association table) ПользовательВЧате.
В виде SQL это будет выглядить примерно так:
CREATE TABLE Chats (id INTEGER PRIMARY KEY, name TEXT, topic TEXT);
CREATE TABLE Users (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE UserInChat(
    chat_id INTEGER, 
    user_id INTEGER, 
    FOREIGN KEY (chat_id) REFERENCES Chats(id),
    FOREIGN KEY (user_id) REFERENCES Users(id),
    PRIMARY KEY (chat_id, user_id)
);

Что это нам даёт?
- Наличие записи в UserInChat означает, что пользователь находится в чате.
- Каждая запись в UserInChat ссылает на существующего пользователя и на существующий чат.
- Сочетание пользователь-чат уникально, т.е. пользователь не может войти в один чат дважды (одновременно).
- В то же время, могут быть записи с одним и тем же пользователем (один пользователь в нескольких чатах).
- Могут быть записи с одним и тем же чатом (много пользователей в одном чате).

Как узнать, какие пользователи находятся в чате? Используем запрос с JOIN.
SELECT Users.id as userid, Users.name as username
FROM Users INNER JOIN UserInChat ON Users.id = UserInChat.user_id
WHERE UserInChat.chat_id = 123456;


Для добавления пользователя в чат делаем INSERT INTO в таблицу UsersInChat. Для удаление - DELETE FROM. Тут всё как обычно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
Да тупо проверить все... DEMO fiddle (ищется строго одна единица в поле на всю таблицу). Возвращается имя первой по списку колонки, которая соответствует заданному критерию, либо 'none', если ни одна колонка не соответствует.

SELECT CASE WHEN SUM(CASE WHEN col1 = 1 THEN 1 END) = 1 THEN 'col1'
            WHEN SUM(CASE WHEN col2 = 1 THEN 1 END) = 1 THEN 'col2'
            WHEN SUM(CASE WHEN col3 = 1 THEN 1 END) = 1 THEN 'col3'
            ELSE 'none'
            END where_only_one_1
FROM test;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы