Как мне работать с недетерминированным значением c в SQLite3? - PullRequest
0 голосов
/ 11 апреля 2020

Ниже вы можете увидеть таблицы в моей базе данных sqlite3:

  • песни
  • файлы
  • теги
  • плейлисты

Это отношения между таблицами:

  • Один к одному: песни и файлы
  • Многие ко многим: песни и теги, песни и списки воспроизведения

Ниже вы можете увидеть таблицы запросов, которые я использую:

create_songs_table_query = """ CREATE TABLE IF NOT EXISTS songs (
                                song_id integer PRIMARY KEY AUTOINCREMENT,
                                title text NOT NULL,
                                artist text NOT NULL,
                                added_timestamp integer NOT NULL,
                                file_id INTEGER NULL,
                                FOREIGN KEY (file_id)
                                REFERENCES files (file_id)
                                ON DELETE CASCADE
                          ); """

create_files_table_query = """ CREATE TABLE IF NOT EXISTS files (
                                        file_id integer PRIMARY KEY AUTOINCREMENT,
                                        filename text NULL,
                                        size integer NULL,
                                        song_id INTEGER NOT NULL,
                                        FOREIGN KEY (song_id)
                                        REFERENCES songs (song_id)
                                        ON DELETE CASCADE                                
                                ); """

create_tags_table_query = """CREATE TABLE IF NOT EXISTS tags (
                                 tag_id integer PRIMARY KEY AUTOINCREMENT,
                                 tag_text  text NOT NULL,
                                 tag_timestamp integer NULL,

                                ); """

create_songs_tags_table_query = """CREATE TABLE IF NOT EXISTS songs_tags (
                                    song_tag_id  integer PRIMARY KEY AUTOINCREMENT,
                                    song_id INTEGER NOT NULL,
                                    tag_id INTEGER NOT NULL,
                                    FOREIGN KEY (song_id)
                                    REFERENCES songs (song_id)
                                    ON DELETE CASCADE,  
                                    FOREIGN KEY (tag_id)
                                    REFERENCES tags (tag_id)
                                    ON DELETE CASCADE  
                                    ); """

create_playlists_table_query = """CREATE TABLE IF NOT EXISTS playlists (
                                      playlist_id  integer PRIMARY KEY AUTOINCREMENT,
                                      playlist_title text NOT NULL,
                                      created_timestamp  INTEGER NOT NULL,
                                      updated_timestamp  INTEGER NULL,
                                    ); """

create_songs_playlists__table_query = """CREATE TABLE IF NOT EXISTS songs_playlists (
                                            song_playlist_id integer PRIMARY KEY AUTOINCREMENT,
                                            song_id INTEGER NOT NULL,
                                            playlist_id INTEGER NOT NULL,
                                            FOREIGN KEY (song_id)
                                            REFERENCES songs (song_id)
                                            ON DELETE CASCADE,
                                            FOREIGN KEY (playlist_id)
                                            REFERENCES playlists (playlist_id)
                                            ON DELETE CASCADE  
                                        ); """

Я пытаюсь получить общее количество песен, которые имеет каждый тег, и упорядочить по ним:

SELECT tags.tag_id, tags.tag_text, COUNT(tags.tag_id) AS total, tags.included, tags.tag_timestamp 
FROM tags 
JOIN songs_tags ON tags.tag_id = songs_tags.tag_id 
GROUP BY songs_tags.tag_id 
ORDER BY total DESC

Это запрос для заказа по тегам.tag_text:

SELECT tags.tag_id, tags.tag_text, COUNT(tags.tag_id) AS total, tags.included, tags.tag_timestamp 
FROM tags 
JOIN songs_tags ON tags.tag_id = songs_tags.tag_id 
WHERE tags.included = 1
GROUP BY songs_tags.tag_id
ORDER BY tags.tag_text

Я использую Python и Pycharm. Python не возвращает никаких записей, и Pycharm показывает мне следующее всплывающее окно в окне редактора:

Nondeterministic value: column tag_text is neither aggregated, nor mentioned in GROUP BY clause 

Хотя, если я запускаю запрос из консоли базы данных PyCharm, я получаю желаемые результаты.

Это немного сложно, есть идеи?

1 Ответ

0 голосов
/ 11 апреля 2020

Правильно запишите запрос, чтобы столбцы SELECT и GROUP BY были согласованы:

SELECT t.tag_id, t.tag_text, COUNT(*) AS total, t.included, t.tag_timestamp 
FROM tags t JOIN
     songs_tags st
     ON t.tag_id = st.tag_id 
WHERE t.included = 1
GROUP BY t.tag_id, t.tag_text, t.included, t.tag_timestamp
ORDER BY t.tag_text;

Это также ввело псевдоним таблицы, что облегчает написание и чтение запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...